1

我有大型 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 发布同一订阅?

4

1 回答 1

1

我在以下链接上得到了这个问题的解决方案: keepSubscriberReferenceAlive

它说,如果您在短时间内引发多个事件并注意到它们的性能问题,您可能需要订阅强委托引用。

默认情况下,CompositePresentationEvent维护对订阅者处理程序和订阅过滤器的弱委托引用。这意味着 CompositePresentationEvent 持有的引用不会阻止订阅者的垃圾收集。使用弱委托引用使订阅者无需取消订阅,并允许进行适当的垃圾收集。

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

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

StatusMessageEvent>().Subscribe(OnCommandLineStatusReturned, ThreadOption.UIThread,true);
于 2012-07-16T08:58:55.157 回答