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

标签 c# multithreading async-await task-parallel-library extension-methods

在看了很多关于 await/async 的资料后,我仍然对这个主题有一些误解。 请对我的问题提供简短的回答(是/否)和详细的回答,以便我更好地理解。

假设我们有以下方法:

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

问题:

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

最佳答案

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

  1. 没有

  2. 没有

  3. 如果不await,可能是这样,比如

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

关于C# await之后代码会继续执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64843895/

相关文章:

c# - 从 Web 服务调用方法时 SessionId 发生变化

java - 来自 Java Runnable 的 Py4J 回调

java - 当可能在另一个线程中更新时使用 hashmap 值引用是否安全

c++ - std::future::get() 或 std::future::wait() 是 std::thread::join() 的替代品吗?

node.js - mongoose.connection.collections.collection.drop() 每隔一段时间就会抛出错误

c# - 无法使用 SteamKit2 连接到 steam

c# - String.Format - 从 C++ 迁移到 C#

javascript - 我的代码是使用异步等待的最佳方式吗?

c# - JSON 响应字段未定义

c# - Task.Run() 如何传递其他线程拥有的对象?