我有一個得到了住在我的應用程序的UI線程主要對象。這個長期存在的父/容器對象包含一個作爲內部多線程的私有成員的子對象。
基於從孩子/包含對象發佈的某些事件,我希望父對象簡單地Dispose()
孩子並重新創建它。
包含的對象擁有一些非託管資源以及一些大的託管內存緩衝區。
我能創建頂級對象,這是否對事件處理程序,但這意味着要被設置在物體會在方法調用即將取代它的調用堆棧。 (!)
這是因爲事件處理程序委託將由它自己的線程上的某個子對象的狀態處理函數調用。
這似乎...錯了。沒有?
特別是,孩子的FireAnEvent()
方法將在處理委託調用後恢復執行,只是現在執行將在已經「處置」的對象的上下文中恢復。
直覺上,我看不到這導致好東西。
問:
有一個既定的C#模式銷燬包含的對象,因爲它本身的事件的結果?
或者,是否有GC魔法讓某個簡單的事件處理程序足夠好?
或者,我錯過了一些關鍵的理解?
是短期居住的兒童對象,而不是長期居住的父母?而通過父母和孩子你是指類和子類,還是容器和包含? – Assaf 2014-09-19 00:43:23
可能是您需要創建一些線程控制邏輯,一旦您的孩子檢測到它需要終止,它將終止線程。或者讓你的孩子進入獨立的過程。然後,終止這個孩子將意味着該過程中的所有線程被破壞,只要您將其標記爲「背景」即可。 http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground%28v=vs.110%29.aspx – 2014-09-19 00:44:49
這是主觀的。如果完全有C#模式,那麼請考慮一下,沒有一個Microsoft組件具有「如果此事件和該事件未被觸發,您只能調用Dispose()」手冊頁。這是一個不明智的事情,你通常不能確定程序員是否考慮過這種可能性。當然,這不是你的問題,你可以很容易地測試它,修復很容易。如果你討厭這個想法,那就考慮另一種方法,你總是可以使用BeginInvoke()來稍後執行Dispose調用。一個優秀的調度員循環:) – 2014-09-19 01:11:38