棱镜事件聚合器缓冲
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 作为参数并且可以在取消订阅后记住最后一个事件负载。
问题很简单,真的。 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 作为参数并且可以在取消订阅后记住最后一个事件负载。