c# - 在其阻塞版本中使用方法的异步实现

标签 c# .net asynchronous async-await task-parallel-library

我创建了一个 Stream 的自定义子类,并实现了 Read。 不过,实现中使用的操作可以很好地利用 async API,因此我也想提供一个 ReadAsync 实现。

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

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

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

谢谢!

最佳答案

Would there be any implications with this approach?

是的,这是 sync over async anti-pattern ,应该避免。主要原因是它很容易导致死锁

怎么可能呢?当您阻塞线程时,您的内部 ReadAsync 可能正在等待异步操作完成。例如,如果此线程是 UI 消息循环线程,则它当前处于阻塞状态。当您的 await 完成时(假设您没有在内部使用 ConfigureAwait(false)),它会在尝试将延续编码回它时发生死锁。

编写异步代码时,您会遇到一些代码重复,这是无法避免的。尝试尽可能多地重复使用。例如,如果两种代码方法在开头都有同步部分,您可以将其提取到异步和同步版本都将使用的第三种方法。

关于c# - 在其阻塞版本中使用方法的异步实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28825819/

相关文章:

node.js - 包装 process.nextTick 导致超出最大调用堆栈大小

c# - System.ComponentModel - 忽略属性

c# - 安全协议(protocol)类型扩展.Tls12;在当前上下文中不存在

c# - FactRetreiver 和 FactCreator 有什么区别?

.net - 防止错误无法在某些服务器上创建 SSL/TLS 安全通道

c# - HttpWebRequest.AllowAutoRedirect=false 会导致超时?

c# - 完成任务时手动捕获和应用 SynchronizationContext

c# - 是否有必要在 EventHandler.BeginInvoke (C# .Net 3.5) 的回调中调用 EndInvoke

c# - 麦当劳到 C# 中的 ProperCase

c# - 有没有办法通过 C# 命令以管理员身份打开 CMD?