C# 用于处理连续消息流的反应式扩展
我有一个消息处理应用程序,目前可以处理很容易放入内存的小消息。我正在扩展它,使其能够处理比内存大的消息(10到100千兆字节),这将需要某种流方法。我喜欢到目前为止所看到的反应式扩展(尤其是)如何对异步推送事件流进行建模,以及Rx如何与C#中的其他构造和模式进行互操作,例如C# 用于处理连续消息流的反应式扩展,c#,.net,system.reactive,reactive-programming,C#,.net,System.reactive,Reactive Programming,我有一个消息处理应用程序,目前可以处理很容易放入内存的小消息。我正在扩展它,使其能够处理比内存大的消息(10到100千兆字节),这将需要某种流方法。我喜欢到目前为止所看到的反应式扩展(尤其是)如何对异步推送事件流进行建模,以及Rx如何与C#中的其他构造和模式进行互操作,例如System.IO.stream(请参见前面的链接)、和 例如,IObservable之类的东西是Rx流的普通示例。因为我的应用程序实现的MyMessage表示的数据太大,无法放入内存,所以我需要类似于IObservable的
System.IO.stream
(请参见前面的链接)、和
例如,IObservable
之类的东西是Rx流的普通示例。因为我的应用程序实现的MyMessage
表示的数据太大,无法放入内存,所以我需要类似于IObservable
的东西,其中数量可变的MyMessageChunk
实例组合起来表示一个MyMessage
。我需要一些类似于这个画质高雅的大理石图:
在上图中,每个圆圈代表一条消息的一部分,颜色表示消息之间的中断。红色的X表示绿色消息处理中的错误,但我需要继续处理以下紫色消息,即使OnError
的语义要求终止流。末尾的绿色条表示OnCompleted
,在本例中,这实质上意味着关闭应用程序,而不是成功完成任何一条消息
有没有一种方法可以用Rx模拟这种处理?根据您提供的简短问题描述,使用
IObservable
中的T
对数据进行编码似乎是正确的方法。()
只能调用一次OnError
,然后根据Rx语法终止可观察对象,因此这不会是一个问题:
OnNext*(未完成| OnError)
有关详细信息,请参阅
但是,当发生错误时,您可以使用诸如
Retry
和Catch
之类的运算符以不同的可观察对象或原始可观察对象递归地继续序列。如果您有一个函数IObservable ReadChunck(Chunk Chunk)
,则可以使用observeable.OnErrorResumeNext()组合它们
。这将在调用OnError
或OnCompleted
时连接块
IObserable<T> finalStream = Observable.OnErrorResumeNext(
ReadChunk(chunk1),
ReadChunk(chunk2),
ReadChunk(chunck3);
IObserable finalStream=Observable.OnErrorResumeNext(
ReadChunk(chunk1),
ReadChunk(chunk2),
ReadChunk(chunck3);
或者,您可以将
ReadChunk
s组合成一个IEnumerable
,也可以使用。您能提供一些示例代码吗?@MatthewFinlay我添加了一些关于该问题的附加说明。这有帮助吗?我在“T的力量”上找到了您的链接非常有帮助。我突然想到一种可能的建模方法是使用“通道”您描述的方法。本质上,我需要一个IObservable
。外部可观测对象将呈现一个可观测流,每个可观测流将呈现单个消息的消息块流。OnError
这些流中的事件可以正确处理,语义将更符合Rx模型。Nic注意,嵌套的观察值实际上是一个“窗口”模型,而不是一个“通道”模型。“通道”意味着某种回调机制。