我会简单说明一下。
在阅读文章“使用 ASP.NET Core SignalR 中的流式传输”(第一部分,服务器到客户端流式传输)后,请问ChannelReader[T]和IAsyncEnumerable[T]有什么区别?
我会简单说明一下。
在阅读文章“使用 ASP.NET Core SignalR 中的流式传输”(第一部分,服务器到客户端流式传输)后,请问ChannelReader[T]和IAsyncEnumerable[T]有什么区别?
ChannelReader<T> |
IAsyncEnumerable<T> |
|
---|---|---|
通常(在SignalR之外)被认为是有限大小的 | 否 | 是 |
可以潜在地具有无限大小(即可以无限迭代) | 是 | 是 |
可以被SignalR安全地完成(即停止) | 否 | 是 |
IAsyncEnumerable<T>
具有有限大小的一般期望”我不太确定。从ChannelReader<T>
获取IAsyncEnumerable<T>
并不罕见,所以对于一个的期望也应该适用于另一个。 - undefinedIAsyncEnumerable<T>
具有的机制(而ChannelReader<T>
缺少的)用于通知其完成的方法是DisposeAsync
方法,该方法属于IAsyncEnumerator<T>
。当await foreach
循环正常或异常退出时,DisposeAsync
会自动调用。 - undefinedChannelReader<T>.ReadAllAsync
实现的 (编译器生成的)IAsyncEnumerable<T>
的返回类型在调用和等待其DisposeAsync
方法时不会Complete()
写入器。真是气人。 - undefinedChannelReader<T>
可以被多个工作线程消费。如果一个通道因为其中一个消费者由于异常意外死亡而自动Complete
,那就没有意义了。ChannelReader<T>.ReadAllAsync
对DisposeAsync
信号没有用处,所以它会忽略它(迭代器中没有finally
)。 - undefined