如何取消订阅使用lambda表达式的事件?

时间:2009-04-30 07:51:32

标签: c# .net c#-3.0 event-handling lambda

我有以下代码让GUI响应集合中的更改。

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

首先,这是一个很好的方法吗?

第二:取消订阅此活动的代码是什么?它是相同的但是 - =(然后又是完整的匿名方法)?

3 个答案:

答案 0 :(得分:35)

首先......是的,这是一个很好的方式,它干净,小巧,易于阅读和阅读。理解......当然需要注意的是“除非你以后想取消订阅”。

我相信Jon Skeet在此之前指出 “当涉及使用匿名方法创建的委托的等效性时,规范明确地不保证行为。”

因此,如果您以后需要取消订阅该事件,您最好实际创建一个委托实例,以便稍后可以挂起该参考。

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

答案 1 :(得分:20)

如果您需要取消订阅活动,则需要实例参考。不幸的是,这意味着您无法使用该特定语法。

答案 2 :(得分:1)

这是一个不错的方法,除非myObservableCollection的寿命超过'this',在这种情况下你最终会出现内存泄漏,因为在幕后创建的委托将保留对你的''的引用这个',这将使它保持活力。如果您反复创建并“摧毁”正在收听事件的任何内容,您会发现它们并未被垃圾收集器收集。

如果这是一个问题,你可以去答案中建议的路线,保留对处理程序的引用,你必须先创建它。

另一个解决方案是使用弱引用来创建一个事件处理程序,如果没有其他引用,将允许收集订阅者。我在this question and answer中探讨了这个解决方案。