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

Posted

技术标签:

【中文标题】“异步”调用图中的最后一次调用是不是需要同步?【英文标题】: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);

【问题讨论】:

【参考方案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(()=> ...);

以上是关于“异步”调用图中的最后一次调用是不是需要同步?的主要内容,如果未能解决你的问题,请参考以下文章

同步与异步数据库访问

Java 多线程 同步和异步

vue同步组件和异步组件的区别

同步(Synchronous)和异步(Asynchronous)

结合同步和异步方法调用,并根据异步的结果,我们需要循环同步方法调用

如何实现webservice的异步调用