我寫了我的第一個MVVM應用程序。當我關閉應用程序時,我經常因ObjectDisposedException而導致崩潰。當應用程序窗口消失後,應用程序就會死機。獲取堆棧跟蹤很困難(see my other question),但最後我做了,並發現我的堆棧跟蹤完全包含在C#庫(kernel32!BaseThreadStart,mscorwks!Thread,mscorwks!WKS等)中。如何解決我的C#/ MVVM應用程序中無法解析的ObjectDisposedExceptions?
此外,這次崩潰是不一致的。在我上次結帳並重建之後,它停止了一段時間...。然後它回來了。一旦開始發生,即使我「清理」並重建,它也會繼續發生,。但擦拭和結賬有時會讓它停一會兒。
什麼,我認爲正在發生的事情:
我覺得我的處置時的ViewModels的GarbageCollector做一些有趣的事情。我的ViewModelBase類析構函數有一個WriteLine來記錄何時調用析構函數,而我的4個ViewModel中只有2或3個被處理,而且它看起來根據結帳而變化(例如,當我運行它時,我看到一個一致的重複序列,但我的同事看到不同的序列與不同的對象處理)。
由於stacktrace中沒有我的代碼調用,所以我認爲這意味着它不是調用已處理對象的方法的代碼我的代碼。所以這讓我認爲CLR是愚蠢的。
這是否有意義?有什麼方法可以讓GC保持一致?這是紅鯡魚嗎?在我App.xaml.cs文件的應用程序的啓動事件處理程序創建
我所有的意見和的ViewModels的:
,可以幫助其他細節。同一個處理程序將ViewModels分配給DataContext。我不確定這是否是正確的MVVM練習(正如我所說,我的第一個MVVM應用程序),但我不明白爲什麼它會導致不良行爲。
如果需要,我可以粘貼代碼。
爲什麼你的ViewModel首先有終結器?你應該*幾乎不需要*終結者。 –
這是從我學習MVVM的文章中的一個類。終結者除了登錄行之外什麼都不做,所以我不認爲它是有害的。你認爲這是造成這次事故嗎? –
我懷疑它是*導致*崩潰(除非控制檯本身已被處置),但這通常是一個壞主意。值得注意的是,垃圾回收和調用Dispose是非常不同的東西。 –