c# - 异步,只有一个等待

标签 c# .net asynchronous parallel-processing

这段代码有意义吗?

async Task DoSomething() {
     await service.doSomething();
}

只是类似吗?

Task DoSomething() {
    return service.doSomething();
}   

或者和这个一样吗?

 void DoSomething() {
    service.doSomething().Wait();
}   

哪种代码最适合这种情况?

最佳答案

您的初始示例:

async Task DoSomething() 
{
     await service.doSomething();
}

是一个比您的第一个替代方案效率稍低的版本:

Task DoSomething() 
{
    return service.doSomething();
}   

它更昂贵,因为它必须创建与异步代码相关的整个状态机,而上面显示的版本不需要这样做。如果您要使用反汇编程序(例如 IlSpy)并检查编译器生成的符号,您会看到为您的 async 创建了一个特殊的类。如果您不使用异步,则不会创建该版本( DoSomething<d__0> 或类似版本)。

另一方面,你的第二个例子——使用.Wait() ——应尽可能避免。它说明了两个问题:

  • 使用.Wait意味着您选择退出async ,这违背了整个观点。 (“异步”代码现在在调用线程上调用并阻塞)
  • 使用.Wait也经常导致线程死锁,最好通过允许 await 来解决。通过代码传播的语义。

关于c# - 异步,只有一个等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516743/

相关文章:

c# - 并发队列和栈在.NET 4中的应用

c# - 如何在保持控件完全可见的同时使窗体透明?

c# - ASP.Net MVC - 带集合的模型,提交

c# - 如何使用 C# 检索存储过程?

c# - WPF 自定义控件构造、触发器和事件

c# - 如何排序 List<Point>

c# - Visual Studio 2010 对 .NET 4.5 的支持

javascript - 同步 .each 与异步 .ajax

node.js - Node 将 Promise 与异步模块结合使用

javascript - Firebase - 等待来自异步数据库调用的数据