C#代码在等待之后会继续执行吗



在阅读了大量关于wait/async的内容后,我对这个主题仍然有一些误解。请为我的问题提供一个简短的答案(是/否(和一个长的答案,这样我才能更好地理解。

假设我们有以下方法:

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

问题:

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

wait大致意思是"等待完成">

  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. 希望现在能更清楚一点

最新更新