Не удается определить причину исключения 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;
}
}