如何安全地混合同步和异步代码?

Igo*_*tis 18 .net c# deadlock asynchronous async-await

我有这个纯粹同步的库.它暴露了同步方法,我有客户端使用它.

对于想要使用它的人,我将底层实现更改为异步和公开的异步方法.但现在我有很多复制代码.异步代码似乎表现更好.我希望现有客户能够利用它,我想消除代码重复.

有没有安全的方法来保持同步签名和调用异步实现?

在打电话时我特别害怕死锁.Result和.Wait.

Yuv*_*kov 19

我强烈鼓励你不要这样做

首先,读取我应该为异步方法公开同步包装器吗?我应该揭露异步包装器同步的方法呢?作者:Stephan Toub.

我不这样做的主要原因:

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

  2. 异步同步 - 可扩展性.一旦我看到异步端点,我认为它是纯粹的异步,对我来说,因为API的消费者意味着没有任何线程在"我背后"旋转.如果您的用户假设相同,则发现每次调用异步方法时,使用线程池线程会在尝试向外扩展时严重损害性能.如果用户想要使用a包装同步方法Task.Run,请将其留给他们进行调用,并判断他们将如何影响他们的应用程序

  • 听起来像C#异步功能是半生不熟的,IMO.没有"采用"策略.说"重复......"不是答案. (9认同)
  • IM#异步功能非常出色,IMO.你是对的,没有"简单的出路",但这是一个设计决定,不会让它变得不那么"烘焙".您的代码库需要适应异步. (2认同)
  • 你说任何一种方式都不是一种选择,但你从来没有指定一个选项,当你必须这样做.假设你有一个异步和同步类需要遵守的合同,你会采用哪种方式来实现合同,同步或异步? (2认同)