c# - 如何安全地混契约(Contract)步和异步代码?

标签 c# .net asynchronous async-await deadlock

<分区>

我有这个完全同步的库。它公开了同步方法,我有客户在使用它。

我将底层实现更改为异步,并为任何想要使用它的人公开了异步方法。但是现在我有很多重复的代码。异步代码似乎表现更好。我希望现有客户能够利用它,并且我希望消除代码重复。

是否有任何安全的方法来保持同步签名并调用异步实现?

我特别害怕在调用 .Result 和 .Wait 时出现死锁。

最佳答案

我强烈建议你不要这样做

首先,阅读Should I expose synchronous wrappers for asynchronous methods?Should I expose asynchronous wrappers for synchronous methods? Stephan Toub 着。

我不会这样做的主要原因:

  1. Sync over Async - 如您所说,死锁。在调用链的更高或更低位置,使用 ResultWait 异步可能是有风险的业务。这实际上取决于您运行的平台(ASP.NET、UI、控制台),因为每个平台的行为都略有不同(即使使用 ConfigureAwait(false))

  2. 异步优于同步 - 可扩展性。一旦我看到一个异步端点,我就假设它是纯异步的,这对我来说,因为 API 的消费者意味着没有任何线程在“背后”旋转。如果您的用户假设相同,发现每次调用异步方法时都会使用线程池线程,这会在尝试横向扩展时严重损害性能。如果用户想用 Task.Run 包装一个同步方法,让他们自己进行调用,并自行判断这将如何影响他们的应用程序

关于c# - 如何安全地混契约(Contract)步和异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296325/

相关文章:

c# - WCF .svc 工作但不是配置文件

java - Redis 对象序列化向后兼容性

c# - 使用未知类型动态构建 LINQ 表达式

c# - .NET Maui 不确定进度条

.net - 您如何从X509Certificate2解析主题备用名称?

database - Swift 2 - 如何在异步方法之后运行代码?

java - Akka actor 的 Bulkheading 策略

c# - 如何在字典中找到最小键

c# - 按值传递和按引用传递

带有进度和线程噩梦的 Java 异步数据加载