<T> 没有异步/等待的嵌套任务调用



这与下面的帖子有关:为什么要一直使用Async/await。

我很好奇在以下情况下会发生什么:

因评论而更新:

async Task FooAsync()
{
    await Func1();
    // do other stuff
}
Task Func1()
{
    return Func2();
}
async Task Func2()
{
    await tcpClient.SendAsync();
    // do other stuff
}

整个过程是否成为阻塞调用? 或者因为 Func1() 实际上是在等待,UI 可以去处理其他事情吗? 最终是否有必要在 Func1() 上添加 async/await? 我已经玩过它,但我实际上没有注意到任何差异,因此问题。 任何见解都会很棒,谢谢!

Asyncawait只是编译器的功能。

如果没有await调用异步方法将导致它以同步(阻塞)方式执行。

当您编写await编译器自动将下面的所有代码await包装在Task.ContinueWith()方法中时,这意味着当任务完成时,下面的代码稍后执行

public async Task<int> method2(){
  return Task.FromResult(1);
}
public void method1(){
  await method2()
  Console.WriteLine("Done");
}

将翻译如下内容:

  public Task<int> method2(){
      return Task.FromResult(1);
    }
    public void method1(){
      method2().ContinueWith(x => {
        Console.WriteLine("Done");
      });
    }

不制作Func1async方法并且不在其中await Func2的唯一问题是任何抛出的异常都不会显示Func1

底线是await工作在可厌和Task/Task<T>可厌的。

最新更新