我有大型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发布同样的订阅?
答案 0 :(得分:1)
我在以下链接上找到了此问题的解决方案: keepSubscriberReferenceAlive
它说,如果您在短时间内提出多个事件并注意到性能问题,则可能需要使用强委托引用进行订阅。
默认情况下, CompositePresentationEvent 会为订阅者的处理程序维护弱委托引用,并在订阅时进行过滤。这意味着CompositePresentationEvent所持有的引用不会阻止订阅者的垃圾收集。使用弱委托引用可以使订阅者免于取消订阅并允许正确的垃圾收集。
维护此弱委托引用比相应的强引用慢。对于大多数应用程序,此性能不会很明显,但如果您的应用程序在短时间内发布大量事件,则可能需要对CompositePresentationEvent使用强引用。
我修改了我的订阅方法如下。
StatusMessageEvent>().Subscribe(OnCommandLineStatusReturned, ThreadOption.UIThread,true);