gpt4 book ai didi

c# - 在 Prism 的不同模块中订阅事件

转载 作者:行者123 更新时间:2023-12-03 10:12:56 25 4
gpt4 key购买 nike

在 View 模型中的我的 LoginModule 中,我正在调度一个事件:

void LoginUpdate(object sender, EventArgs e)
{
_eventAggregator.GetEvent<LoginStatusEvent>().Publish(_status);
}

EventModule 中:

public class LoginStatusEvent : PubSubEvent<LoginStatus>
{
}

然后我尝试在不同的模块中订阅它:

public class EventModule : IModule
{
IRegionManager _regionManager;
IEventAggregator _eventAggregator;
private SubscriptionToken subscriptionToken;
private bool isLoggedIn { get; set; }

public EventModule(IEventAggregator eventAggregator, IRegionManager regionManager)
{
_regionManager = regionManager;
_eventAggregator = eventAggregator;

LoginEventsListener();
}

public void Initialize()
{

}

public void LoginEventsListener()
{
LoginStatusEvent loginStatusEvent = _eventAggregator.GetEvent<LoginStatusEvent>();

if (subscriptionToken != null)
{
loginStatusEvent.Unsubscribe(subscriptionToken);
}

subscriptionToken = loginStatusEvent.Subscribe(LoginStatusEventHandler, ThreadOption.UIThread, false);
}

public void LoginStatusEventHandler(LoginStatus loginStatus)
{
Trace.WriteLine(">> Got it!!");

}

}

但是 LoginStatusEventHandler 从未被触发,我也没有收到任何错误。

最佳答案

OP 在订阅事件时没有保留 Subscriber Reference,所以在某一时刻类根本没有引用并被 GC 收集。

所以在这种情况下,它将使用 True 标志进入 Subscribe 方法。

正如@Haukinger 所说:

在 Prism 文档中 https://github.com/PrismLibrary/Prism/blob/ef1a2266905a4aa3e7087955e9f7b5a7d71972fb/Documentation/WPF/30-ModularApplicationDevelopment.md#initializing-modules

默认情况下,模块实例的生命周期是短暂的。在加载过程中调用 Initialize 方法后,释放对模块实例的引用。如果您没有建立到模块实例的强引用链,它将被垃圾回收。如果您订阅的事件对您的模块具有弱引用,则此行为可能难以调试,因为当垃圾收集器运行时您的模块就会“消失”。

关于c# - 在 Prism 的不同模块中订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37936064/

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