我使用弱事件的時候,我不能確定地退訂(否則我寧願+=
和-=
而不是弱事件):弱事件和GC
class SomeType
{
public SomeType(...)
{
// object doesn't know when it will be removed
WeakEventManager(SomeSource, EventArgs).AddHandler(someSourceInstance,
nameof(SomeSource.SomeEvent), (s, e) => { ... });
}
}
這樣,如果對象被垃圾回收,那麼事件處理程序不會被調用。完善。
但是,如果對象是尚未收集垃圾(但沒有更多強引用),則仍會調用事件處理程序。
我的問題相當一般:使用弱事件應該怎麼做?我是否應該在使用弱事件時期望事件處理程序中的無效呼叫?或者我應該force GC以避免這種情況(確定性的「清理」)?還有別的嗎?
你已經得到它 - 弱事件允許訂閱者被垃圾收集,如果他們只能通過事件處理程序保持活躍狀態。他們不是因爲訂閱者符合GC要求而擺脫事件處理程序,這是一個副作用。你可以稱之爲「無效呼叫」,但事實並非如此。所以簡短的回答是「是的,你應該期望這樣的電話」; 「你甚至在做什麼這是一個問題,你是否缺少可以使你的意圖明確的代碼」? –
@JeroenMostert,由於缺少' - =',導致內存泄漏。這並不容易*(我沒有說*不可能*)提供取消訂閱,因此我試圖使用弱事件。他們完美地解決了內存泄漏問題,但又出現了另一個問題......因此我的問題。我應該如何表達「這個對象要求這種方法被稱爲」清晰? 'IDisposable'? – Sinatr
'IDisposable'是一種方式,是的。這是C#用於確定性清理的主要機制。雖然技術上僅用於釋放非託管資源,但即使未涉及非託管資源,它也被廣泛用於確定性清除框架。它具有語言支持('使用')的好處,並明確地向開發者發出信號,表明應該明確發佈該對象。然而,甚至比「IDisposable」更好的是找出對象的所有權規則,並且讓所有者負責「關閉」對象,如果可能的話。 –