你並不需要在正常的情況下退訂。
事件訂戶不能防止出版商(testClass
)從被收集,但可能發生相反。除了ObservableCollection
之外,我看不到任何保留testClass
的內容。
testClass.SomeEvent += this.OnSomeEvent;
testClass
是保持this
活着,因爲this
存儲在testClass.SomeEvent
的調用列表(當有SomeEvent
這樣OnSomeEvent
被調用)。通過訂閱testClass
的活動,this
不會保持testClass
活着。
在下面的代碼中,obj
從集合中刪除,它是垃圾回收沒有退訂,你可以嘗試運行代碼,看看結果:
void Main()
{
var obj = new BackgroundWorker();
obj.DoWork += OnSomeEvent;
var oc = new ObservableCollection<object>{ obj };
WeakReference objRef = new WeakReference(obj);
Console.WriteLine(objRef.IsAlive);
oc.Remove(obj);
obj = null;
GC.Collect();
Console.WriteLine(objRef.IsAlive);
}
private void OnSomeEvent(object sender, DoWorkEventArgs e)
{
Console.WriteLine("work");
}
輸出:
真
假
你可以看看similar question。
Thnx。什麼是最好的方法?我正在做collectionChanged。 – Sasha