新库中的异步与非异步方法

Gig*_*igi 9 c# asynchronous task async-await

在.NET 4.5中,现在有许多方法可以用于异步和非异步对,例如Flush()FlushAsync().理想情况下,I/O交互在可能的情况下始终是异步的(.Wait()如果您确实需要,可以随时阻止),但非同步(阻塞)版本显然需要保留,因为它们具有向后兼容性.

在推出一个没有向后兼容性限制的全新库时,是否有任何理由可以包含非异步方法?

Ned*_*nov 7

异步方法通常需要与它们相关的成本,因为编译器生成的状态机会产生相当多的额外代码.如果您不使用这些async方法,他们将不会被jitted,因此您可以避免这种费用.

如果您使用该async版本并且只是调用Wait()您正在冒着死锁的风险,那么一旦async操作完成,您将会产生额外的上下文切换.总的来说,结果会略差一些.

此外,您获得的任何异常现在都将被包含在内,AggregatedException因此在异常处理中也会有额外的工作.查看异步性能:了解异步和等待的成本

  • 这是一个很好的观点,但是,您应该记住,与基础 I/O 请求相比,所有这些成本几乎总是微不足道的。因此,几乎任何时候使用异步 I/O 都非常好用(毕竟,您在执行 File.ReadAllBytes 等操作时也是如此——它只是发生在较低层)。将它用于 CPU 工作等的成本更高,但是,* 有* 指导方针反对让 `XXXAsync` 方法只将同步代码包装在 `Task.Run` 中,所以如果你正在做适当的异步工作,成本是'太糟糕了。 (2认同)

Mic*_*ger 0

唯一的原因是如果您想要支持针对 .NET Framework 4.5 之前版本的应用程序。如果您有此类应用程序并且想要使用新库,那么您将被迫使用非异步方式。

您还可以使用异步目标包通过 .NET 4.0 编译新程序集。为此,我建议您创建两个项目:一个使用 4.5,另一个使用 4.0。