C#中的多个发布者和单个订阅者

时间:2012-07-12 11:36:09

标签: wpf mvvm prism publish-subscribe

我有大型WPF-MVVM应用程序,其中我有1个订阅和2个发布模式。 我订阅了如下活动:

EventAggregator.GetEvent<StatusMessageEvent>().Subscribe(OnCommandLineStatusReturned, ThreadOption.UIThread);

回调方法是:

private void OnCommandLineStatusReturned(StatusMessageEventArgs args)
{
   //some data to display
}

现在我必须用两个不同的对象发布这个事件两次。

private StatusMessageEventArgs statusMessageEventArgs;
private StatusMessageEventArgs responsestatusMessageEventArgs;

我在不同的时间发布了这些实例,

EventAggregator.GetEvent<StatusMessageEvent>().Publish(statusMessageEventArgs);
EventAggregator.GetEvent<StatusMessageEvent>().Publish(responsestatusMessageEventArgs);

但是当我运行应用程序时,它行为不端。即中有10次,2次回调方法根本没有被调用。是因为2发布同样的订阅?

1 个答案:

答案 0 :(得分:1)

我在以下链接上找到了此问题的解决方案: keepSubscriberReferenceAlive

它说,如果您在短时间内提出多个事件并注意到性能问题,则可能需要使用强委托引用进行订阅。

默认情况下, CompositePresentationEvent 会为订阅者的处理程序维护弱委托引用,并在订阅时进行过滤。这意味着CompositePresentationEvent所持有的引用不会阻止订阅者的垃圾收集。使用弱委托引用可以使订阅者免于取消订阅并允许正确的垃圾收集。

维护此弱委托引用比相应的强引用慢。对于大多数应用程序,此性能不会很明显,但如果您的应用程序在短时间内发布大量事件,则可能需要对CompositePresentationEvent使用强引用。

我修改了我的订阅方法如下。

StatusMessageEvent>().Subscribe(OnCommandLineStatusReturned, ThreadOption.UIThread,true);