2012-12-05 39 views
2

我有對象訂閱自定義事件,所以我可以一次性更改它們。麻煩的是,那永遠不會讓他們超出範圍並被垃圾收集。即使爲null控件也不會使其中包含的控件爲空。事實上,即使是無效的控件也不會收集! (請糾正我,如果我在任何一點錯誤。)如何擁有對象/控件儘管訂閱了事件GC'd

所以我想到了一個解決方案,將包裝事件在一個類中,創建該類的實例並使用它,然後將其清空當我想讓對象得到GC'd,並創建一個新的實例來繼續。

不過,我對此兩個問題:

  1. 它確實能工作,或將對象仍然逃避是GC'd?
  2. 有沒有更簡單,更直接的方法來實現呢?

編輯:第2部分已回答(在評論中回答)。簡單地做:event_name = null;。不過,我仍然想知道第1部分 - 它會起作用嗎?

+1

的[弱事件模式](http://msdn.microsoft.com/en-us /library/aa970850.aspx)對於這類問題非常有用。 – vcsjones

+0

@vcsjones看起來不錯。但它似乎是爲WPF。我正在使用winforms。 – ispiro

回答

0

答案的第2部分(由Servy的註釋):

event_name = null; 
3

您需要退訂您的活動。這與訂閱相同,但使用-=運算符而不是+=

實施例:

foo.SomeEvent-= new EventHandler(foo_SomeEvent); 
+0

我不想爲了那個而遞歸地遍歷所有這些。該事件的意圖之一是不必跟蹤所有訂閱它的對象。但是,謝謝。 – ispiro

+1

@ispiro您沒有事件的所有者執行取消訂閱,您有任何訂閱該事件的取消訂閱。 – Servy

+0

@Servy好點。有什麼方法可以取消訂閱活動的所有訂閱?將'event_name = null;'這樣做沒有完全消除該事件? – ispiro