【问题标题】:does the last call in 'async' call graph need to be synchronous?“异步”调用图中的最后一次调用是否需要同步?
【发布时间】:2014-12-18 10:31:17
【问题描述】:

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

为了清楚起见(简而言之,来自 C#):

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

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

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

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

【问题讨论】:

    标签: c# asynchronous


    【解决方案1】:

    这在一定程度上取决于“同步”的含义。在某些方面,所有方法都是同步的(甚至是async 的方法)——它们只是同步返回一些可以等待的东西,并且一旦等待就可能有更多的事情要做。

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

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

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

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

    两者都不是特别有用,但是;他们会工作的。实际上,大多数async 方法都会在async IO - 文件系统、网络等正在做的事情上触底反弹。在您的示例中,实际上没有什么是真正的async 无论如何 em> - 当到达await 时,一切都会完成。

    【讨论】:

    • 谢谢 Marc,我正在使用 aysnchronous 的含义,现在添加到我的问题中。不幸的是,我的示例是人为设计的,但我的观点是最后一个方法通常是同步的 - 尽管有 async/await 组合,但 return await Task.FromResult(2) 是同步的,因为它返回后没有要运行的代码。然而,我现在想到了一个异步 last 方法的例子——它的代码被包裹在 Task.Run() 中。例如私有任务 M2Async(){Task.Run(()=> ...)};
    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2023-03-05
    • 1970-01-01
    • 2020-05-14
    • 2015-12-31
    • 2016-01-11
    相关资源
    最近更新 更多