c# - 任务等待困惑

标签 c# asynchronous async-await task

我有以下内容

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.Runasync/await代码。 Task.Factory.StartNew创建并启动一个新任务而不真正等待结果,但同步执行返回的任务时除外,这发生在您删除 C 内部的等待时.

关于c# - 任务等待困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36459509/

相关文章:

c# - 显示从Windows窗体引发的正确错误消息

javascript - 嵌套函数中的回调

c# - ConfigureAwait 并将异步调用与同步调用混合

C# 向xml文件中添加数据

c# - 删除导出到文本文件的列之间的空格

c# - 如何使 Entity Framework 异步执行

c# - 使用 async 和 DataRow 的非线程安全代码

c# - 如何从异步方法返回对象 (c# - xamarin.forms)?

c# - DotnetNuke 模块集成

python - 一起使用asyncio和Tkinter(或另一个GUI库),而无需卡住GUI