【问题标题】:Prism 2.1 Publish/Subscribe with weak reference?Prism 2.1 发布/订阅弱引用?
【发布时间】:2010-12-26 11:35:12
【问题描述】:

我正在构建一个 Prism 2.1 演示,以快速了解该技术。我遇到了通过事件聚合服务发布和订阅的 CompositePresentationEvents 的问题。如果我设置一个强引用(KeepSubscriberReferenceAlive = true),事件订阅工作正常,但如果我设置一个弱引用(KeepSubscriberReferenceAlive 省略),它会失败。

我想订阅一个弱引用,这样我就不必管理取消订阅事件。有没有办法做到这一点?为什么这里需要强引用?感谢您的帮助!

具体细节如下:我的演示应用是单线程的,有两个区域,Navigator 和 Workspace,以及三个模块,NavigatorModule、WorkspaceAModule 和 WorkspaceBModule。 NavigatorModule 有两个按钮,“显示工作区 A”和“显示工作区 B”。单击其中一个按钮时,将调用一个发布名为 ViewRequested 的 CompositePresentationEvent 的 ICommand。该事件带有一个字符串有效负载,指定应显示哪个工作区模块。

这是来自应用基础设施项目的事件声明:

using Microsoft.Practices.Composite.Presentation.Events;

namespace Prism2Demo.Common.Events
{
    public class ViewRequestedEvent : CompositePresentationEvent<string>
    {
    }
}

这是来自 Navigator 模块的事件发布代码:

// Publish ViewRequestedEvent
var eventAggregator = viewModel.Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Publish(workspaceName);

这里是事件订阅代码,每个 Workspace 模块都包含在其 Initialize() 方法中:

// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);

Subscribe() 语句带有强引用。

再次感谢您的帮助。

【问题讨论】:

  • 在 Subscribe() 方法中有一个记录在案的错误:compositewpf.codeplex.com/WorkItem/…。但是,我认为这不是我所经历的原因。我认为正在创建一个弱引用,但它正在被垃圾收集。
  • 那么问题出在哪里?

标签: prism prism-2


【解决方案1】:

需要检查的几件事:

确保您的 EventAggregator 实例已正确注册到容器中,否则它本身可能会被垃圾回收:

container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());

还要确保您对某处保存的订阅对象具有强引用(订阅代码中的this)。

【讨论】:

  • 谢谢,格雷姆。我不确定我是否遵循对订阅对象的字符串引用。你能扩展一点,或者提供一个示例代码行吗?再次感谢。
  • 将此作为“强有力的参考” - 对此感到抱歉!
  • 我的意思是确保订阅者对象本身没有被收集(我确定你已经拥有了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多