Форма как-то избавляется
У меня есть клиент-серверное приложение, в котором я использую классические сокеты и потоки для приема / отправки данных и прослушивания клиентов.
Приложение работает нормально, но через некоторое время я получаю исключение ObjectDisposedException:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'MainForm'.
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
at System.Windows.Forms.Control.Invoke(Delegate method)
Этот код вызывается из клиентского потока Socket, и я использую метод Invoke() для запуска кода в потоке пользовательского интерфейса.
Я уверен, что я не удаляю форму вручную и не использую Close () (форма закрывается при нажатии пользователем кнопки "Закрыть"), поэтому я не знаю, что может вызвать ее удаление.
Изменить: Исключение не выдается при закрытии формы - это происходит совершенно случайно.
2 ответа
Вы пытались переопределить Dispose
метод и поставить точку останова там? Callstack, вероятно, даст вам представление о том, почему / где он находится.
У меня была похожая проблема, я просто скрывал форму и никогда не закрывал ее или не выбрасывал.
Основная причина удаления формы произошла из-за DialogResult кнопки Cancel, которая фактически вынуждала закрытие формы, а затем удаление было неявным.
Чтобы преодолеть это, я просто удалил диалоговое окно DialogResult из формы.