gpt4 book ai didi

c# - 在没有等待的情况下调用的异步方法中的等待是否仍然是异步的?

转载 作者:行者123 更新时间:2023-11-30 13:43:27 26 4
gpt4 key购买 nike

考虑以下代码:

public static void Run() {
DoStuffAsync();
}

public static async Task DoStuffAsync() {
PerformCalc();
await DoLongTaskAsync();
PerformAnotherCalc();
}

假设我调用了 Run()。我有几个关于行为的问题:

  1. 是否会在调用 Run() 的同一线程上同步调用 PerformCalc()
  2. 将异步调用还是同步调用 DoLongTaskAsync()?换句话说,是否/可以在 DoLongTaskAsync() 完成之前调用 PerformAnotherCalc()
  3. 随后,DoStuffAsync() 方法能否在 DoLongAsyncTask() 执行完成之前返回?

最佳答案

异步方法总是开始同步运行。魔法发生在 await 处,但只有当 await 被赋予一个尚未完成的 Task 时。

在您的示例中,调用 Run() 时会发生以下情况:

  1. 跳转到 DoStuffAsync()
  2. 跳转到PerformCalc()
  3. 跳转到DoLongTaskAsync()
  4. 如果 DoLongTaskAsync() 是真正的异步操作并返回不完整的Task,则await 执行其作业和 DoStuffAsync() 将不完整的 Task 返回给 Run()
  5. 由于没有等待任务,Run() 完成。
  6. DoLongTaskAsync() 完成时,DoStuffAsync() 恢复,并跳转到 PerformAnotherCalc()

所有这些都可以发生在同一个线程上。

所以回答你的问题:

  1. 是的。如果它是一个 async 方法,它可能最终会在其他线程上执行操作。但它会在同一个线程上同步启动。
  2. DoLongTaskAsync() 将被异步调用,但 PerformAnotherCalc() 不会在 DoLongTaskAsync() 完成之前被调用,因为您使用了 等待
  3. 是的。这就是 await 的工作原理。它将返回一个不完整的 Task(即,仅当 DoLongTaskAsync() 真正异步并返回一个不完整的 Task 时)。然后,一旦 DoLongTaskAsync() 完成,DoStuffAsync() 的执行将从中断处恢复。

关于c# - 在没有等待的情况下调用的异步方法中的等待是否仍然是异步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57509346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com