gpt4 book ai didi

c# - EventAggregator 无法跨模块访问

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:20 26 4
gpt4 key购买 nike

我试图让我的 IEventAggregator 允许我在一个模块中发布和事件并在另一个模块中捕获它。我在一个模块/项目中尝试了下面的代码,效果很好。只有当我有一个模块/项目发布事件而另一个订阅它时,它才会失败。

我已经通过统一将我的 IEventAggregator 注入(inject)到两个模块中。

我有 3 个项目,其中两个有模块(称为 A 和 B),一个只是一个普通的类库(称为接口(interface))

在类库接口(interface)中有这样的代码:

public class RandomTestEvent : CompositePresentationEvent<string>
{
}

在模块 A 中,按钮单击命令中有此代码(这实际上是在项目的 View 模型中):
var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
evt2.Publish("Testing");

在模块 B 中有以下代码:
    public void Initialize()
{
var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
evt2.Subscribe(OnRandomThingDone);
}

private void OnRandomThingDone(string obj)
{
MessageBox.Show("Random Event Done With: " + obj);
}

我可以追踪并看到订阅被调用。当我看到 Publish 被调用时,调试器说 Subscriptions = 1 (所以它知道订阅已完成,所以我似乎没有 2 个不同的 IEventAggregator 实例。)

但是 OnRandomThingDone 在 Publish 之后永远不会被调用。

任何想法为什么? (我需要发布更多代码吗?如果需要,请告诉我。)

最佳答案

真的是随机猜测 - 您的订阅者在事件发布之前得到了 GC - 因为 Prism 的 CompositePresentationEvent 的默认行为是使用 Wea​​kReferences 来保留订阅者目标引用。

所以...尝试调用订阅重载,它允许您指定 keepSubscriberReferenceAlive 并传入 true。

如果您的订阅者随后成功接收到事件,则意味着包含 OnRandomThingDone 的类超出范围并在事件发布之前获得 GC。

随机 API 引用:
http://msdn.microsoft.com/en-us/library/ff921122(PandP.20).aspx

关于c# - EventAggregator 无法跨模块访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com