在與我的老闆談話時,他似乎對.NET非常瞭解,他曾經說過我應該習慣於將控件的事件分配給控件設計師。是否應該將事件分配給控件
我不記得他的確切解釋,但我記得事件的線沒有包含在同一個線程中,它實際上並沒有完全清理垃圾收集?這是通過電話討論,我的耳機很爛,聽不清他說的究竟是什麼
我只是希望有人能詳細說明,或者指出我進一步閱讀的方向?
謝謝!
對於它的價值,我們正在使用.NET 3.5
在與我的老闆談話時,他似乎對.NET非常瞭解,他曾經說過我應該習慣於將控件的事件分配給控件設計師。是否應該將事件分配給控件
我不記得他的確切解釋,但我記得事件的線沒有包含在同一個線程中,它實際上並沒有完全清理垃圾收集?這是通過電話討論,我的耳機很爛,聽不清他說的究竟是什麼
我只是希望有人能詳細說明,或者指出我進一步閱讀的方向?
謝謝!
對於它的價值,我們正在使用.NET 3.5
有這個簡單的規則。僅當事件源對象超出事件訂閱者對象時,才需要顯式取消訂閱事件。
這幾乎從來沒有在Winforms應用程序中的情況,因爲窗體對象以及它包含的組件和控件同時死亡。該表單通過Controls集合提供了對控件的引用。控件可以通過其事件的委託對象引用表單,這可以保持表單對象的活性。你老闆的擔心。然而,垃圾收集器沒有像這樣的循環引用的問題,它與控件和事件委託對象同時收集表單對象。
有幾種選擇情況,其中事件源對象確實超出訂戶對象。 Application.Idle事件和SystemEvents事件的情況。值得注意的是這些事件是他們是static並因此保留了它們對於程序生命的訂閱對象引用,GC無法提供幫助。當關閉表單不會終止應用程序時,需要明確地取消訂閱這些事件。
如果您對自己的代碼有任何疑問,請使用內存分析器來驗證您的假設。
感謝您的詳細回覆!正是我所希望的。 – sab669
我理解的方式和我使用的經驗法則是,如果您在設計器中添加事件,那麼您就可以,不必將其刪除。但另一方面,如果您手動將其添加到後面的代碼中,則需要自行移除它以防止內存泄漏。 –
@MarkHall哦,那是什麼?他曾經討論過導致內存泄漏的問題,我認爲這聽起來很奇怪,因爲默認情況下VS會在設計器中爲您創建代碼。 如你所說,我猜他肯定一直在談論我是否在代碼中手動分配它。 – sab669
不是百分百肯定他在說什麼(我不在那裏:)),但那些是我使用的指導原則。 –