在其阻止版本中使用方法的异步实现

Den*_*nis 1 .net c# asynchronous task-parallel-library async-await

我创建了一个Stream带有实现的自定义子类Read.实现中使用的操作可以很好地利用asyncAPI,所以我也想提供一个ReadAsync实现.

这些方法共享许多类似的行为,避免代码重复的最简单方法是将逻辑保留在ReadAsync实现中并在实现中使用它Read.这看起来像这样:

public override int Read(byte[] buffer, int offset, int count)
{
    return ReadAsync(buffer, offset, count).Result;
}
Run Code Online (Sandbox Code Playgroud)

这种方法会有什么影响吗?由于该Read方法应该阻塞当前线程,我认为它完全符合规范.

谢谢!

Yuv*_*kov 6

这种方法会有什么影响吗?

是的,这是异步反模式同步,应该避免.主要原因是它很容易导致死锁.

怎么会这样?ReadAsync当你阻塞一个线程时,你的内部可能正在等待异步操作完成.如果这个线程是例如UI消息循环线程,它当前被阻止.当你await完成时(假设你没有在ConfigureAwait(false)内部使用),当试图将连续编组到它上面时,它会陷入僵局.

在编写异步代码时,您将有一些代码重复,没有解决这个问题.尝试尽可能多地重用.例如,如果两个代码方法在开头都有同步部分,则可以将其提取到异步和同步版本将使用的第三种方法.