C# await之后代码会继续执行吗?
C# Will code execution continue after await?
看了很多await/async,我对这个话题还是有一些误解。
请对我的问题进行简答(yes/no)和长答,以便我更好地理解。
假设我们有以下方法:
public async Task UnresultTaskMethod()
{
await AsyncMethod1();
await AsyncMethod2();
}
问题:
- 当代码执行到 AsyncMethod1 时,是否会在执行 AsyncMethod1() 时自动移动到调用 AsyncMethod2?
- 当代码执行到AsyncMethod2时,方法的执行会结束,执行会return到调用者,在执行之前AsyncMethod2 完全结束?
- 是否存在这样的情况,方法的执行将在对异步方法的调用完全完成之前结束(例如方法是 void 而不是任务)?
- 什么时候我需要把
Task.WaitAll(tasks); Task.WhenAll(tasks);
放在最后,这样我就可以确保在所有任务结束之前不会继续执行,这是让我感到困惑的主要因素,为什么要等待如果您可以通过关键字 await?
- 我在想什么时候执行会碰到async方法和await,会放到processing schedule上,继续执行函数里面的代码,感觉理解错了。
await 大致意思是'wait until completed'
否
否
如果不await,可能是这样,比如
public async Task UnresultTaskMethod()
{
Task.Delay(2000);
// We haven't awaited, so we're here right away
await AsyncMethod2();
}
当您立即等待单个任务时,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
}
使用 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
方法。
- 希望现在更清楚一些
看了很多await/async,我对这个话题还是有一些误解。 请对我的问题进行简答(yes/no)和长答,以便我更好地理解。
假设我们有以下方法:
public async Task UnresultTaskMethod()
{
await AsyncMethod1();
await AsyncMethod2();
}
问题:
- 当代码执行到 AsyncMethod1 时,是否会在执行 AsyncMethod1() 时自动移动到调用 AsyncMethod2?
- 当代码执行到AsyncMethod2时,方法的执行会结束,执行会return到调用者,在执行之前AsyncMethod2 完全结束?
- 是否存在这样的情况,方法的执行将在对异步方法的调用完全完成之前结束(例如方法是 void 而不是任务)?
- 什么时候我需要把
Task.WaitAll(tasks); Task.WhenAll(tasks);
放在最后,这样我就可以确保在所有任务结束之前不会继续执行,这是让我感到困惑的主要因素,为什么要等待如果您可以通过关键字 await? - 我在想什么时候执行会碰到async方法和await,会放到processing schedule上,继续执行函数里面的代码,感觉理解错了。
await 大致意思是'wait until completed'
否
否
如果不await,可能是这样,比如
public async Task UnresultTaskMethod()
{
Task.Delay(2000);
// We haven't awaited, so we're here right away
await AsyncMethod2();
}
-
当您立即等待单个任务时,
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
}
使用 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
方法。
- 希望现在更清楚一些