ObjectDisposedException - DangerousAddRef
Я получил довольно сложное консольное приложение.net, которое использует WPF для некоторых окон уведомлений, а также выполняет http-вызовы. В очень редких случаях происходит сбой приложения, и единственное сообщение об ошибке, которое я могу получить, приходит из окна просмотра событий Windows:
Application: xyz.exe
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ObjectDisposedException
Stack:
at System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean ByRef)
at Microsoft.Win32.Win32Native.SetEvent(Microsoft.Win32.SafeHandles.SafeWaitHandle)
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
Я понятия не имею, откуда происходит трассировка стека. Есть идеи, где искать эту проблему? Вот некоторые из моих мыслей:
Поскольку в стеке есть этот таймер, может ли он быть связан с System.Threading.Timer? Потому что в коде используются таймеры?
Существует также некоторая HTTP-коммуникация (httpclient, httpwebrequest), которая использует тайм-ауты. Может ли быть связь с этой ошибкой?
Извините за очень неопределенный вопрос, но я полностью застрял здесь и мне просто нужна какая-то отправная точка.
1 ответ
У меня была та же проблема, и я обнаружил, что следующий код вызывает исключение:
using (ManualResetEvent resetEvent = new ManualResetEvent(false))
{
timer.Dispose(resetEvent);
resetEvent.WaitOne(1000);
}
В случае, если таймер не расположен в течение секунды, может произойти исключение. Решение - избавиться от resetEvent, только если метод WaitOne возвращает true.