C# await 后代码执行会继续吗?

Posted

技术标签:

【中文标题】C# await 后代码执行会继续吗?【英文标题】:C# Will code execution continue after await? 【发布时间】:2021-02-26 19:37:52 【问题描述】:

在阅读了很多关于 await/async 的内容后,我仍然对这个主题有一些误解。 请对我的问题提供一个简短的答案(是/否)和一个长答案,以便我更好地理解。

假设我们有以下方法:

public async Task UnresultTaskMethod()

   await AsyncMethod1();
   await AsyncMethod2();

问题:

    当代码执行到 AsyncMethod1 时,它会在 AsyncMethod1() 执行的同时自动移动到调用 AsyncMethod2 吗? 当代码执行到AsyncMethod2时,方法的执行是否结束,在AsyncMethod2执行完之前返回调用者结束了吗? 是否存在这样的情况,即方法的执行将在对 async 方法的调用完全完成之前结束(例如,方法是 void 而不是任务)? 当我需要把Task.WaitAll(tasks); Task.WhenAll(tasks);放在最后,这样我就可以确保在所有任务结束之前不会继续执行,这是我困惑的主要因素,为什么要在这个等待任务如果你可以通过关键字 await 来等待它们? 我在想什么时候执行会碰到带有await的异步方法,它会把它放在处理计划中,并继续执行函数内部的代码,我感觉我理解错了。

【问题讨论】:

Asynchronous programming with async and await -- Async and Await -- Async Programming, Brownfield Async Development -- Asynchronous programming 【参考方案1】:

await 大致意思是“等到完成”

    没有

    没有

    如果你不等待,例如可能是这种情况

public async Task UnresultTaskMethod()

   Task.Delay(2000);

   // We haven't awaited, so we're here right away
   await AsyncMethod2();

    Task.WaitAllTask.WhenAll 在您立即等待单个任务时没有意义。但是,您可以这样做:
public async Task UnresultTaskMethod()
 
   var task1 = AsyncMethod1();
   var task2 = AsyncMethod2();

   // The tasks are now doing their job

   await Task.WhenAll(task1, task2);
 
   // Here you are sure both task1 and task2 are completed

Task.WaitAll 会是这样的:

public async Task UnresultTaskMethod()
 
   var task1 = AsyncMethod1();
   var task2 = AsyncMethod2();

   // This is not awaitable, you're blocking the current thread
   Task.WaitAll(task1, task2);
 
   // Here you are sure both task1 and task2 are completed

在这种情况下,您不需要async Task,因为您没有在等待,即它实际上是一个void 方法。

    希望现在更清楚一点

【讨论】:

以上是关于C# await 后代码执行会继续吗?的主要内容,如果未能解决你的问题,请参考以下文章

java:throw异常后代码还会继续执行?

java中异常抛出后代码还会继续执行吗

JavaScript异步/等待:等待后代码不会继续[重复]

初探asp.net异步编程

C# 异步方法加await调用不就变成同步方法了吗

C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!