【发布时间】:2022-09-24 05:11:20
【问题描述】:
嗨,我不清楚 WeakEventManager 在.net 中的用法。
我知道强参考和弱参考之间的区别。
- 保持强直到取消订阅没有发生。
- 周 - 调用 GC 收集时 => “非确定性时间”
在第二种情况下,我会错过事件,因为可以随机删除侦听器。或者我错过了什么?
例如 MVVM 社区工具包使用此模式在视图模型之间发送/接收消息。但是什么时候可以“随机”删除消息永远不会出现。
有人能给我解释一下这种模式和安全性吗?谢谢
嗨,我不清楚 WeakEventManager 在.net 中的用法。
我知道强参考和弱参考之间的区别。
在第二种情况下,我会错过事件,因为可以随机删除侦听器。或者我错过了什么?
例如 MVVM 社区工具包使用此模式在视图模型之间发送/接收消息。但是什么时候可以“随机”删除消息永远不会出现。
有人能给我解释一下这种模式和安全性吗?谢谢
对对象的普通引用是强引用。此外,.Net 提供了一个特殊类,用于为特殊情况创建对对象的弱引用。 Microsoft 文档说,当应用程序的代码可以到达该对象时,GC 无法收集应用程序正在使用的对象。据说该应用程序对该对象具有强引用。 (在这里查看弱参考解释Microsoft Wark Reference documentation)。
因此,当应用程序仍在使用侦听器时,不能从内存中随机删除它,换句话说,当它仍然对它有强引用时。例如,引用视图模型类的窗口的 DataContext 属性是对视图模型的强引用。 如果您使用弱事件管理器,它只会保留对已注册侦听器的弱引用,因此如果没有其他找到强引用(因为应用程序的其余部分不再使用该对象),则允许 GC 收集该对象。就应用程序而言,它不会引起任何问题,因为应用程序无论如何都不使用该对象。
【讨论】: