Не удается определить причину исключения System.ObjectDisposedException при завершении работы приложения.

Я застрял в сценарии отладки, и мне нужна помощь, чтобы понять, как я могу получить больше информации о том, что происходит с моим приложением.

Исключение выдается, когда я закрываю основную форму, по-видимому, во время последнего бита обработки перед полным завершением работы.

Я получаю одно из двух следующих исключений, без очевидной причины, почему одно или другое. Я могу просто открыть приложение и сразу же закрыть его. Один из двух будет сгенерирован. Если есть подвох, вероятно, что № 2 представляется более вероятным, если я сфокусируюсь на другом запущенном приложении, вернусь к моему и затем закрою его.

Исключение № 1:

Невозможно получить доступ к удаленному объекту.
Имя объекта: "System.Net.Sockets.NetworkStream".
в System.Net.Sockets.NetworkStream.Write(буфер Byte[], смещение Int32, размер Int32)

Исключение № 2:

Безопасная ручка была закрыта
System.Net.UnsafeNclNativeMethods.OSSOCK.WSAEventSelect(SafeCloseSocket socketHandle, событие IntPtr, AsyncEventBits NetworkEvents)

В моем приложении есть два непосредственных использования Сокетов.

1) прослушиватель UDPClient устанавливается на BackgroundWorker, Просто небольшая вещь, которую мы используем для внутреннего контроля за базами данных.

2) HttpWebRequest, который вызывает наш сайт и получает некоторую информацию.

Оба они были в игре некоторое время без проблем и без изменений, поэтому я подозреваю, что они не виноваты.

Поскольку это приложение базы данных клиент-сервер, происходит большое количество сетевого трафика, и вполне возможно, что ядро ​​базы данных находится там, где это происходит. Я просто не знаю, и там, где мне нужна помощь.

Пакет / анализатор трафика? Настройки / настройки в Visual Studio, чтобы получить более подробную информацию об исключении? Как бы вы отследили это?

1 ответ

Я предполагаю, что вы используете VisualStudio в качестве среды отладки.

  • Нажмите пункт меню "Отладка"
  • Нажмите пункт меню "Исключение..."
  • Открыть элемент дерева "Исключение общего времени выполнения"
  • Открытое дерево элементов "Система"
  • Прокрутите вниз до "System.ObjectDisposedException"
  • Проверьте свой CheckBox на "Брошенный"
  • Нажмите "ОК"

Теперь, когда вы отлаживаете, оно будет прерываться, когда выдается это исключение, даже если вы его нигде специально не перехватываете.

Добавить try...catch вокруг соответствующего куска кода и иметь дело с этим слишком распространенным исключением, которое обычно является не настоящим исключением, а обычным событием потока кода.

Пример:

void OnReceiveFrom(IAsyncObject ar)
{
    try
    {
        // whatever you do
    }
    catch (ObjectDisposedException obex)
    {
        // log to debugging output window, just so you will know.
        Debug.WriteLine(String.Format("{0}: {1}: in OnRecieveFrom",
            obex.GetType().Name, obex.Message));
        // test some variable you set when your application is exiting.
        if (applicationIsShuttingDown)
            return;
        // but if it is unexpected, then re-throw it.
        throw;
    }
}
Другие вопросы по тегам