“异步”调用图中的最后一次调用是否需要同步?

时间:2014-12-18 10:31:18

标签: c# asynchronous

例如,在下面的代码中,最后一个方法M2Async是同步的,没有async / await,否则需要在await之后调用M3Async并且调用图将继续?

为清楚起见(来自果壳中的C#):

  • 同步操作在返回调用者之前完成其工作。
  • 异步操作在返回调用者后完成(大部分或全部)其工作。

    public void Main() {     任务任务= M1Async();     // 一些工作     int i = task.result;     //使用我等 }

    私有异步任务M1Async() {     int i =等待M2Async();     // 一些工作     回归我; }

    私有任务M2Async() {     return Task.FromResult(2); }

1 个答案:

答案 0 :(得分:4)

这取决于你的意思"同步"。在某些方面,所有方法都是同步的(即使是async个) - 它们只是同步返回一些可以等待的东西,一旦等待就可能有更多的事情要做。

不,它不必同步;你的代码也可以是:

private async Task<int> M2Async()
{
    return await Task.FromResult(2);
}

甚至只是(虽然编译器会检测到这是一种气味,并且是秘密同步的):

private async Task<int> M2Async()
{
    return 2;
}

这两者都不是特别有用,但是;他们会工作的。实际上,大多数async方法都会以async IO - 文件系统,网络等方式进行操作。在您的示例中,实际上没有任何内容真正属于async 无论如何 - 当达到await时,它将全部完成。