C#中await执行完成后才会运行后续的“Preparing to finish”代码吗?
关于C# async/await执行顺序的确认
是的,你直觉没错:ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n"; 这一行只会在await httpClient.GetStringAsync执行完成后才会运行。
原因很直接:C#里的await关键字核心作用就是暂停当前异步方法的执行流程,直到它所等待的异步操作(这里就是GetStringAsync发起的网络请求)完成并返回结果。只有当异步操作结束,拿到了目标字符串后,才会继续执行await之后的逻辑——先计算字符串的Length赋值给exampleInt,然后才会执行修改文本框内容的那一行代码。
对你有Java背景的话,可以类比成Java中CompletableFuture的链式回调:await之后的代码就相当于异步任务完成后才会触发的后续逻辑,只不过C#的async/await用同步代码的写法封装了异步流程,看起来像是顺序执行,但底层依然遵循“等待异步操作完成再继续”的规则。
再拆解下关键代码行:
int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
这里await直接作用在GetStringAsync返回的Task<string>上,必须等这个Task完成、拿到字符串结果后,才会调用.Length属性完成赋值,整个这一行执行完,才会进入下一行修改文本框的代码。
内容的提问来源于stack exchange,提问作者ng.newbie
相关产品推荐
相关产品推荐

