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)
是否为每个等待呼叫创建一个新任务?哪个需要一个新线程?
是的,没有。是的,它正在Task为每个异步方法创建一个;该async状态机将创建一个。但是,这些任务不是线程,也不是在线程上运行。他们不会在任何地方“运行”。
您可能会发现我的一些博客文章很有用:
async介绍,解释了如何async/ await工作。Task类型的简介,它解释了某些任务(“委托任务”)如何具有代码并在线程上运行,但是async(承诺任务)所使用的任务没有。鉴于第一个在第一次等待时创建了一个新任务,然后在该新任务中处理了所有内容?
一点也不。任务仅完成一次,并且该方法await直到该任务完成后才能继续。因此,返回的任务甚至在调用Operation1Async之前就已经完成Operation2。
| 归档时间: |
|
| 查看次数: |
1256 次 |
| 最近记录: |