У меня очень странное поведение, которое, кажется, происходит только в одной форме.
В основном я создаю экземпляр Form
и вызываю Show()
, чтобы отобразить неблокирующую форму. В обработчике событий Load
этой формы у меня есть логика, которая может вызывать this.Close()
при определенных обстоятельствах. Это закрывает форму, но затем метод Show()
в коде клиента выдает ObjectDisposedException
.
Трассировка стека из исключения ObjectDisposedException выглядит следующим образом:
в System.Windows.Forms.Control.CreateHandle ()
в System.Windows.Forms.Form.CreateHandle ()
в System.Windows.Forms.Control.get_Handle ()
в System.Windows.Forms.ContainerControl.FocusActiveControlInternal ()
в System.Windows.Forms.Form.SetVisibleCore (логическое значение)
в System.Windows.Forms.Control.Show ()
... и т.д.
Вот что я вижу:
Control.Show()
называется
- моя форма запущена
- метод
OnFormLoad
называется
- вызывается обработчик события
FormLoad
, внутри которого я вызываю this.Close()
- метод
OnFormClosing
называется
- обработчик события
FormClosing
называется
Dispose
вызывается в моей форме и все его пользовательские элементы управления
и затем где-то ближе к концу Control.Show()
метода, он пытается получить дескриптор формы, который приходит в ужас и выдает исключение, потому что объект помечен как удаленный.
Мой реальный вопрос: почему я могу делать это точно так же в любой другой форме, которая у меня есть, без исключений? Это проблема GC? Я попытался сделать GC.Collect()
вызов сразу после this.Close()
, и это не имеет значения. Как я уже сказал, это происходит в этой форме 100% времени, и нигде больше, независимо от дочерних пользовательских элементов управления, области видимости переменной формы и т. Д.
Есть идеи?