【问题标题】:.Net System.IO.Stream async/nonblocking.Net System.IO.Stream 异步/非阻塞
【发布时间】:2015-08-03 21:56:15
【问题描述】:

我想包装一个外部资源并将其转换为我的应用程序中的流(然后由 webapi 控制器中的PushStreamContent 使用)。

C# 中的 Streams 文档并没有真正推断我如何创建使用异步方法的流。

例如,尝试从System.IO.Stream 继承提供了一个非常同步的“读取”方法。理想情况下,我希望我的阅读成为一项“可以等待”的任务。甚至 readAsync 方法看起来也希望读取是同步的,它们只是选择块。

我非常想要 C 语言中的 select 之类的东西,我可以在其中将 IO 设置为准备好读取,然后 readAsync 的内容将继续读取。可能会有数据在外部挂起的点,所以我希望读取调用推迟到其他任务并在准备好时继续读取。

public override int Read(byte[] buffer, int offset, int count)
{
    throw new NotImplementedException();
}

我应该明确覆盖ReadAsync 来完成此操作吗?是否有任何关于如何在 .NET 中实现自己的流的文档

【问题讨论】:

  • 你能澄清一下“ReadAsync ...期望读取是同步的”是什么意思吗?
  • 我不明白你为什么不能直接覆盖 ReadAsyncRead

标签: c# .net asynchronous stream


【解决方案1】:

可读Stream 的基础是同步Read 操作。 Stream 类在同步Read 周围实现ReadAsync,因此您无需重写ReadAsync

如果默认实现还不够(例如,您希望在异步代码中注入一些智能,或者基于您正在流式传输的资源的内部实现进行一些性能改进),那么您可以覆盖 BeginReadEndRead 方法。

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多