C# 在被动扩展中一次处理一个事件 让我们考虑下面的流 SomeState state = new SomeState(). _refreshFiberStream = Stream() .SubscribeOn(new EventLoopScheduler()) .Select(DoCalc) .ObserveOn(DispatcherScheduler.Current) .Subscribe(Update);
DoCalc方法将投射到输入中并使用“state”,结果输出将提供给Update方法,Update方法将修改“state”。若一个新事件出现,它应该根据上一个事件最后更新的状态进行操作,并基于该状态进行项目 我正在寻找一种总是按顺序执行事件的方法。例如,如果我有三个事件,我正在寻找一种方法,以使它们在DoCalc中执行,Update后跟DoCalc,Update后跟DoCalc,Update 相反,我看到的是DoCalc,DoCalc,Update,Update,DoCalc,Update,即它们从不按顺序运行C# 在被动扩展中一次处理一个事件 让我们考虑下面的流 SomeState state = new SomeState(). _refreshFiberStream = Stream() .SubscribeOn(new EventLoopScheduler()) .Select(DoCalc) .ObserveOn(DispatcherScheduler.Current) .Subscribe(Update);,c#,system.reactive,C#,System.reactive,DoCalc方法将投射到输入中并使用“state”,结果输出将提供给Update方法,Update方法将修改“state”。若一个新事件出现,它应该根据上一个事件最后更新的状态进行操作,并基于该状态进行项目 我正在寻找一种总是按顺序执行事件的方法。例如,如果我有三个事件,我正在寻找一种方法,以使它们在DoCalc中执行,Update后跟DoCalc,Update后跟DoCalc,Update 相反,我看到的是DoCalc,DoCalc,Update,Update,DoCalc,Update,即它
是否有一种方法可以在Rx中强制执行它?我发现一方面需要按顺序执行,另一方面需要调度到另一个线程。我的建议是将
Update
分为两部分:
Do(Update)
,并在dispatcher上调用Subscribe(Dispatch)
:
var result =
Stream()
.SubscribeOn(new EventLoopScheduler())
.Select(DoCalc)
.Do(Update)
.ObserveOn(DispatcherScheduler.Current)
.Subscribe(Dispatch);
生成的序列如下(“Dispatch n”调用可以在“Update n”之后的任何时间发生):
第二种方法“有效”,但像这样的线程阻塞让我感到不安——它似乎与反应式编程有交叉作用。当然,同样地,我发现修改共享状态的需要、使用Rx和添加并发性之间存在冲突;-)@李坎贝尔:是的,说得好。。。并发和共享状态需要以某种方式分开。@McGarnagle我想避免线程阻塞,因为这不是正确的方法,我同意并发和共享状态不能同时进行。 Select a Update a Select b Update b Dispatch a Dispatch b
private ManualResetEvent _wait = new ManualResetEvent(true);
private string DoCalc(string input)
{
_wait.WaitOne();
Console.WriteLine("Selected {0}", input);
_wait.Reset();
return input;
}
private void Update(string input)
{
Console.WriteLine("Update {0}", input);
_wait.Set();
}