<分区>
我有这个完全同步的库。它公开了同步方法,我有客户在使用它。
我将底层实现更改为异步,并为任何想要使用它的人公开了异步方法。但是现在我有很多重复的代码。异步代码似乎表现更好。我希望现有客户能够利用它,并且我希望消除代码重复。
是否有任何安全的方法来保持同步签名并调用异步实现?
我特别害怕在调用 .Result 和 .Wait 时出现死锁。
<分区>
我有这个完全同步的库。它公开了同步方法,我有客户在使用它。
我将底层实现更改为异步,并为任何想要使用它的人公开了异步方法。但是现在我有很多重复的代码。异步代码似乎表现更好。我希望现有客户能够利用它,并且我希望消除代码重复。
是否有任何安全的方法来保持同步签名并调用异步实现?
我特别害怕在调用 .Result 和 .Wait 时出现死锁。
最佳答案
我强烈建议你不要这样做
首先,阅读Should I expose synchronous wrappers for asynchronous methods?和 Should I expose asynchronous wrappers for synchronous methods? Stephan Toub 着。
我不会这样做的主要原因:
Sync over Async - 如您所说,死锁。在调用链的更高或更低位置,使用 Result
或 Wait
异步可能是有风险的业务。这实际上取决于您运行的平台(ASP.NET、UI、控制台),因为每个平台的行为都略有不同(即使使用 ConfigureAwait(false)
)
异步优于同步 - 可扩展性。一旦我看到一个异步端点,我就假设它是纯异步的,这对我来说,因为 API 的消费者意味着没有任何线程在“背后”旋转。如果您的用户假设相同,发现每次调用异步方法时都会使用线程池线程,这会在尝试横向扩展时严重损害性能。如果用户想用 Task.Run
包装一个同步方法,让他们自己进行调用,并自行判断这将如何影响他们的应用程序
关于c# - 如何安全地混契约(Contract)步和异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296325/