如何解决Rx.NET的可观察介体
class SomeMediator
{
public string[] Inputs { get; private set; }
public ISubject<string> Response { get; private set; }
public SomeMediator(string[] inputs)
{
Inputs = inputs;
Response = new Subject<string>();
}
}
class SomeProcessor
{
public SomeProcessor(SomeMediator mediator)
{
foreach (var input in mediator.Inputs)
{
var clock = new Timer();
clock.Interval = 1000;
clock.Enabled = true;
clock.Elapsed += new ElapsedEventHandler(
(object source,ElapsedEventArgs e) =>
mediator.Response.OnNext(string.Empty));
}
}
}
class SomeRenderer
{
public SomeRenderer(SomeMediator mediator)
{
mediator.Subscribe(o => Console.WriteLine(o));
}
}
var mediator = new SomeMediator(new[] { "Input#1","Input#2" });
var subscriber = SomeRenderer(mediator);
var processor = SomeProcessor(mediator);
上面的代码将带有2个输入参数的SomeMediator
注入SomeProcessor
中,并将SomeRenderer
订阅到所有响应中。
SomeProcessor
基于2个输入,创建2个Timer
线程,并开始向SomeMediator
发送通知。
每个Timer
都异步调用SomeMediator.Response.OnNext
,下面我收到警告
Warning: 0 : OnNext called while another OnNext call was in progress on the same Observer
结果,第二条OnNext
消息丢失了,因此SomeMediator
仅收到SomeProcessor
的1条响应,而不是2条。
问题
是否可以通过可观察的方式实现调解器交互,并防止由不同线程引起的OnNext
冲突?
更新-示例
比方说,有一个股票交易应用程序具有一些抽象的通用Core
功能,可以被其他应用程序重用。该核心可以包括一些市场数据格式化程序(中介程序),以将各种格式的API响应转换为统一模型(响应)并对其进行可视化(渲染)。应该从不同的网关(处理器)接收到响应,这些网关将具有特定的实现方式,并将取决于经纪公司提供的API。
换句话说,我们有多个处理器,例如SomeProcessor1
,SomeProcessor2
,SomeProcessor3
,它们将充当API包装器。它们接受HTTP请求(输入)的一些输入参数并返回响应。输入由API处理器使用。中介器仅获取结果并将其发送到可视化器。中介器具有Subject
,该变量传递给每个Processor
,并允许Renderer
订阅这些更改。每次某个处理器发送更新时,渲染器都应通过调解器接收此通知,并将其显示在UI中。
Processor1 Processor2 Processor3 (API)
\ | /
Mediator (Aggregate and Format)
/ \
Logger Renderer (Subscribed tasks - Log and display)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。