【发布时间】:2011-11-12 19:14:19
【问题描述】:
我有一系列使用 RX 发布/订阅模型的模块。
这里是事件注册码(每个订阅模块重复):
_publisher.GetEvent<DataEvent>()
.Where(sde => sde.SourceName == source.Name)
.ObserveOn(Scheduler.TaskPool)
.Subscribe(module.OnDataEvent);
发布者简单,感谢José Romaniello's code:
public class EventPublisher : IEventPublisher
{
private readonly ConcurrentDictionary<Type, object> _subjects =
new ConcurrentDictionary<Type, object>(); public IObservable<TEvent> GetEvent<TEvent>()
{
var subject = (ISubject<TEvent>)_subjects.GetOrAdd(typeof(TEvent), t => new Subject<TEvent>());
return subject.AsObservable();
}
public void Publish<TEvent>(TEvent sampleEvent)
{
object subject;
if (_subjects.TryGetValue(typeof(TEvent), out subject))
{
((ISubject<TEvent>)subject).OnNext(sampleEvent);
}
}
}
现在我的问题:正如您在上面看到的,我使用 .ObserveOn(Scheduler.TaskPool) 方法为每个模块、每个事件从池中分离出一个新线程。这是因为我有很多事件和模块。当然,问题在于事件在时间顺序上混淆了,因为一些事件彼此靠近触发,然后最终以错误的顺序调用 OnDataEvent 回调(每个 OnDataEvent 都带有一个时间戳)。
有没有一种简单的方法来使用 RX 来确保事件的正确顺序?或者我可以编写自己的调度程序来确保每个模块按顺序获取事件?
当然,事件是按正确的顺序发布的。
提前致谢。
【问题讨论】:
标签: c# multithreading system.reactive publish-subscribe observer-pattern