2009-04-30 92 views
26

我有以下代码让GUI响应集合中的更改。如何取消订阅使用lambda表达式的事件?

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

首先这是一个好办法吗?

二:什么是从这个事件退订代码?它是相同的,但用 - =(然后再次完整的匿名方法)?

+0

?Duplicate:http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c – Richard 2009-04-30 09:16:23

+0

请参阅[this](http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method -in-C)。 – 2009-04-30 07:56:15

+0

我没有把一个代表我的lambda表达式(如您的链接),所以我没有一个参考退订。 – 2009-04-30 08:03:37

回答

20

如果您需要一个事件来退订,你需要一个实例化的参考。不幸的是,这意味着你不能使用特定的语法。

35

首先...是它做这件事的好方法,它很干净,小巧的外形和容易阅读的&明白......当然是警告“除非你以后想退订”。

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

因此,如果您需要在以后的事件退订,你最好实际创建一个委托实例,所以你可以挂到基准供以后使用。

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

myObservableCollection.CollectionChanged += myDelegate; 

myObservableCollection.CollectionChanged -= myDelegate; 
1

这是去一个好办法,除非myObservableCollection是要活的比“这个”时间越长,在这种情况下,你可以使用一个内存泄漏结束了,因为这是在幕后创建将节约一个委托参考你的'这个',这将保持它的活力。如果您反复创建并“摧毁”正在监听事件的任何内容,您会发现它们并未被垃圾收集器收集。

如果这是一个问题,你可以去在回答提出的路线,节省的处理程序,您必须首先创建一个参考。

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