多个等待操作或仅一个

Uma*_*air 4 c# asp.net-mvc asynchronous async-await

我已经看到了await关键字是如何实现的以及它创建的结果结构。我认为我对此有基本的了解。但是,是

public async Task DoWork()
{
    await this.Operation1Async();
    await this.Operation2Async();
    await this.Operation3Async();
}
Run Code Online (Sandbox Code Playgroud)

“更好”(通常来说)或

public async Task DoWork()
{
    await this.Operation1Async();
    this.Operation2();
    this.Operation3();
}
Run Code Online (Sandbox Code Playgroud)

第一种方法的问题在于,它正在Task为每个等待呼叫创建一个新的?哪个需要一个新线程?

鉴于第一个在第一个Task上创建了一个新项await,然后新项中处理了其中的所有内容Task

编辑 好吧,也许我不太清楚,但是例如,如果我们有

while (await reader.ReadAsync())
{
    //...
}

await reader.NextResultAsync();

// ...
Run Code Online (Sandbox Code Playgroud)

这不是在创建两个任务吗?ReadAsync在这个新创建的任务中,主线程中的第一个任务是第一个任务,然后是另一个任务NextResultAsync。我的问题是确实需要第二个任务,在主线程中创建的一个任务不够吗?所以

while (await reader.ReadAsync())
{
    //...
}

reader.NextResult();

// ...
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

是否为每个等待呼叫创建一个新任务?哪个需要一个新线程?

是的,没有。是的,它正在Task为每个异步方法创建一个;该async状态机将创建一个。但是,这些任务不是线程,也不是在线程上运行。他们不会在任何地方“运行”。

您可能会发现我的一些博客文章很有用:

  • async介绍,解释了如何async/ await工作。
  • 没有线程,它解释了如何在没有线程的情况下工作。
  • Task类型的简介,它解释了某些任务(“委托任务”)如何具有代码并在线程上运行,但是async(承诺任务)所使用的任务没有。

鉴于第一个在第一次等待时创建了一个新任务,然后在该新任务中处理了所有内容?

一点也不。任务仅完成一次,并且该方法await直到该任务完成后才能继续。因此,返回的任务甚至在调用Operation1Async之前就已经完成Operation2