2009-04-30 101 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中探索過這個解決方案。