考虑以下代码:

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

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

假设我叫Run()。关于行为,我有几个问题:
  • 会在与调用PerformCalc()的线程相同的线程上同步调用Run()吗?
  • 是异步还是同步调用DoLongTaskAsync()?换句话说,是否可以在PerformAnotherCalc()完成之前调用DoLongTaskAsync()
  • 随后,可以在完成DoStuffAsync()之前返回DoLongAsyncTask()方法吗?
  • 最佳答案

    异步方法总是开始同步运行。魔术发生在await上,但仅当给await给出了尚未完成的Task时才发生。

    在您的示例中,这就是您调用Run()时将发生的情况:

  • 跳转到DoStuffAsync()
  • 跳转到PerformCalc()
  • 跳转到DoLongTaskAsync()
  • 如果DoLongTaskAsync()是真正的异步操作并返回不完整的Task,则await执行其工作,而DoStuffAsync()返回不完整的TaskRun()
  • 由于未等待任务,因此Run()完成。
  • DoLongTaskAsync()完成时,DoStuffAsync()恢复,并跳转到PerformAnotherCalc()

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

    因此,回答您的问题:
  • 是的。如果它是async方法,则可能最终会消失并在其他线程上执行操作。但是它将在同一线程上同步启动。
  • DoLongTaskAsync()将被异步调用,但是PerformAnotherCalc()不会在DoLongTaskAsync()完成之前被调用,因为您使用了await
  • 是的。这就是await的工作方式。它将返回不完整的Task(即,仅当DoLongTaskAsync()是真正的异步并且返回不完整的Task时)。然后,一旦DoLongTaskAsync()完成,就停止执行DoStuffAsync()
  • 09-25 18:37