繁体   English   中英

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

[英]C# Will code execution continue after await?

在阅读了大量有关 await/async 的资料后,我对这个主题仍然存在一些误解。 请对我的问题提供一个简短的回答(是/否)和一个长的回答,以便我更好地理解。

假设我们有以下方法:

public async Task UnresultTaskMethod()
{
   await AsyncMethod1();
   await AsyncMethod2();
}

问题:

  1. 当代码的执行将到达AsyncMethod1时,它会在执行 AsyncMethod1() 时自动移动到调用 AsyncMethod2 吗?
  2. 当代码执行到AsyncMethod2时,在AsyncMethod2执行完全结束之前,该方法的执行是否结束,并返回到调用方?
  3. 是否存在这样的情况,方法的执行将在对异步方法的调用完全完成之前结束(例如,该方法是无效的而不是任务)?
  4. 当我需要放置Task.WaitAll(tasks); Task.WhenAll(tasks); Task.WaitAll(tasks); Task.WhenAll(tasks); 最后,我可以确保在所有任务结束之前不会继续执行,这是我感到困惑的主要因素,如果可以通过关键字 await 等待它们,为什么还要以这种方式等待任务?
  5. 我在想什么时候执行会碰到带await的async方法,会放到processing schedule上,继续执行function里面的代码,感觉理解错了。

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

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

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

   // We haven't awaited, so we're here right away
   await AsyncMethod2();
}
  1. 当您立即等待单个任务时, 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方法。

  1. 希望现在更清楚了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM