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

Alp*_*mum 0 c# extension-methods multithreading task-parallel-library async-await

在阅读了大量关于 await/async 的文章后,我仍然对这个主题有一些误解。请为我的问题提供简短的答案(是/否)和详细的答案,以便我更好地理解。

假设我们有以下方法:

public async Task UnresultTaskMethod()
{
   await AsyncMethod1();
   await AsyncMethod2();
}
Run Code Online (Sandbox Code Playgroud)

问题:

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

Pat*_*Bak 7

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

  1. 如果您不等待,则可能是这种情况,例如

public async Task UnresultTaskMethod()
{
   Task.Delay(2000);

   // We haven't awaited, so we're here right away
   await AsyncMethod2();
}
Run Code Online (Sandbox Code Playgroud)
  1. Task.WaitAll并且Task.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
}
Run Code Online (Sandbox Code Playgroud)

有了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
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 希望现在更清楚一点