“异步”调用图中的最后一次调用是不是需要同步?
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() 中。例如私有任务以上是关于“异步”调用图中的最后一次调用是不是需要同步?的主要内容,如果未能解决你的问题,请参考以下文章
同步(Synchronous)和异步(Asynchronous)