【问题标题】:Nested Task<T> calls without async/await没有 async/await 的嵌套 Task<T> 调用
【发布时间】:2016-03-08 19:40:58
【问题描述】:

这与以下帖子有关:Why use Async/await all the way down

我很好奇以下场景会发生什么:

因评论而更新:

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?我玩过它,但实际上我没有注意到任何区别,因此提出了这个问题。任何见解都会很棒,谢谢!

【问题讨论】:

  • 无法编译,Func1() 中缺少 return 语句

标签: c# asynchronous async-await


【解决方案1】:

Async 和 await 只是编译器功能。

没有await调用async方法会导致它执行同步(阻塞)方式..

当你在写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");
      });
    }

【讨论】:

  • 注意:它并不像ContinueWith、here is a old answer of mine 这么简单,如果你想看的话,我在这里更详细地解释了相同的概念
  • 而且,如果你不使用async-await,它不会被阻止。
【解决方案2】:

不创建Func1 和async 方法而不是awaiting Func2 的唯一问题是任何抛出的异常都不会显示Func1。

底线是await 适用于awaitables,而Task/Task&lt;T&gt; 是awaitables。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2015-11-10
    • 2015-02-12
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多