我有以下内容
async void A () {
await B();
}
async Task B () {
await Task.Factory.StratNew( ()=> C());
}
async Task C () {
while (true) {
//await Task.Factory.StartNew(()=> {Thread.Sleep(5000);});
Thread.Sleep(5000);
}
}
在上面的程序中,A
永远不会返回,因为 C
中的 while 循环。但是,如果我取消注释 C
和 KEEP Thread.Sleep(5000)
中的行,A
会立即返回。有人能解释一下里面发生了什么吗?
最佳答案
文章 Task.Run vs Task.Factory.StartNew 中详细描述了主要问题.如果您像这样更改您的代码,您会看到您所期望的结果。
async void A()
{
await B();
}
async Task B()
{
// await Task.Factory.StartNew(() => C());
await Task.Run(async () => await C());
// await Task.Run(() => C()); // this would still produce the same effect
}
async Task C()
{
while (true)
{
await Task.Delay(5000);
//Thread.Sleep(5000);
}
}
另见 previous answer by Stephen Cleary .本质上 Task.Factory.StartNew
不尊重async/await
模型,你真的应该使用 Task.Run
与 async/await
代码。 Task.Factory.StartNew
创建并启动一个新任务而不真正等待结果,但同步执行返回的任务时除外,这发生在您删除 C
内部的等待时.
关于c# - 任务等待困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36459509/