Я написал свое первое приложение MVVM.Когда я закрываю приложение, я часто получаю причину сбоя, вызванную ObjectDisposedException.Сбой появляется, когда приложение умирает, сразу после того, как окно приложения исчезает.
Получить трассировку стека было трудно ( см. Мой другой вопрос ), но, наконец, я это сделал и обнаружил, что моя трассировка стекаполностью содержится в библиотеках C # (kernel32! BaseThreadStart, mscorwks! Thread, mscorwks! WKS и т. д.).
Кроме того, этот сбой противоречив.После моей последней проверки и восстановления это перестало происходить ... на некоторое время.Тогда это вернулось.Как только это начинает происходить, оно продолжает происходить, , даже если я "Очистить" и восстановить Но стирание и проверка иногда заставляет его остановиться на некоторое время.
Что я думаю, что происходит:
Я думаю, что GarbageCollector делает что-то смешное, избавляясь от моегоViewModels.У моего деструктора класса ViewModelBase есть WriteLine для регистрации при вызове деструктора, и из моих 4 ViewModels удаляются только 2 или 3, и, кажется, это зависит от извлечения (например, когда я запускаю его на моем, я вижу последовательно повторяющиесяпоследовательность, но мой коллега видит другую последовательность с расположенными разными объектами).
Так как в трассировке стека нет ни одного из вызовов моего кода, я думаю, это означает, что это не мой код, который вызываетметод удаленного объекта.Так что я думаю, что CLR тупой.
Имеет ли это смысл?Есть ли какой-нибудь способ, которым я могу заставить GC быть последовательным?Это красная сельдь?
Другие детали, которые могут помочь: Все мои Views и ViewModels создаются в обработчике события запуска приложения в моем файле App.xaml.cs.Тот же обработчик назначает ViewModels для DataContexts.Я не уверен, является ли это правильной практикой MVVM (как я уже говорил, мое первое приложение MVVM), но я не понимаю, почему это может вызвать плохое поведение.
Я могу вставить код, если необходимо.