棱镜事件聚合器缓冲

Prism EventAggregator Buffering

问题很简单,真的。 EventAggregator 是否缓冲事件?示例:单个订阅者监听 2 个不同的事件,一个 GO 和一个 NO-GO。每个事件都需要一些工作、数据库更新、通知 UI 等。可能有多达 64 个发布者。发布者近乎实时地工作,因此 GO 或 NO-GO 可能会很快到来。事件聚合器也可以缓冲这些,以便订阅者可以串行方式处理它们。

谢谢, 道格

默认情况下,订阅操作与发布事件在同一线程上执行。这意味着在订阅者处理完前一个事件之前,发布者将无法发布另一个事件。所以默认情况下事件实际上是以串行方式处理的。

您可以通过在订阅时指定 ThreadOption 来更改此设置:

eventAggregator.GetEvent<YourEventType>().Subscribe(s =>
            {
    //do something that make take a while but don't block the publisher...
    System.Threading.Thread.Sleep(5000);
}, ThreadOption.BackgroundThread);

您可以使用 EventLoopScheduler from Reactive Extensions 按原始顺序处理事件。 EventLoopScheduler 将在单个后台线程中处理事件发布。调用"Schedule"方法

后不会停止发布者的线程
EventLoopScheduler eventLoopScheduler = new EventLoopScheduler();

eventAggregator.GetEvent<YourEventType>().Subscribe(s =>
{
    eventLoopScheduler.Schedule(() =>
    {
        //handler
    });
});

至于我,我使用 ReactiveUI 中的 MessageBus 而不是 EventAggregator,因为它可以将 IScheduler 作为参数并且可以在取消订阅后记住最后一个事件负载。