Tag: 弱事件

C#语言:为什么WeakReference或弱事件模式?

我正在阅读“C#语言”,第4版,它谈到WeakReference和Weak Event Pattern : CHRISTIAN NAGEL:内存泄漏通常是由于错误使用事件造成的。 如果客户端对象附加到事件但不从它们分离,并且不再使用对客户端对象的引用,则垃圾回收器仍然无法回收客户端对象,因为发布者的引用仍然存在。 这可以通过(1)在不再使用客户端对象时分离事件,(2)使用持有委托的WeakReference类的自定义实现add和remove访问器,或(3) Weak Event pattern避免。 WPF使用IWeakEventListener接口。 我在这里有疑问:选项“(2) WeakReference ”根本没有带来任何便利 ,比较“选项(1)明确地分离事件”,因为使用WeakReference仍然需要显式调用add和remove 。 否则,即使其中一个事件处理程序的对象被指定为null,“孤立”对象仍将响应该事件 – 这将导致意外行为。 注意: WeakReference仅以事件处理程序对象不会受事件发布者对象影响的方式帮助垃圾收集; WeakReference不会强制事件处理程序对象被垃圾收集。 类似的问题也适用于弱事件模式。 也许这有点抽象,以Josh Smith的Mediator模式(http://joshsmithonwpf.wordpress.com/2009/04/06/a-mediator-prototype-for-wpf-apps/)为例。 public class Mediator //… { public void Register(object message, Action callback) { // notice: Mediator has no Unregister method } public void NotifyColleagues(object message, object parameter) { // … […]

将所有标准事件处理程序替换为WeakEventManager或其varian是否安全?

标准事件处理程序(带有运算符+ = )是内存泄漏原因之一(如果它没有未注册/处置(使用– =运算符))。 微软用WeakEventManager及其inheritance解决了它: PropertyChangedEventManager,CollectionChangedEventManager,CurrentChangedEventManager,ErrorsChangedEventManager等。 内存泄漏的简单示例代码是: public class EventCaller { public static event EventHandler MyEvent; public static void Call() { var handler = MyEvent; if (handler != null) { handler(null, EventArgs.Empty); Debug.WriteLine(“=============”); } } } public class A { string myText; public A(string text) { myText = text; EventCaller.MyEvent += OnCall; // Use code […]