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.

Другие вопросы по тегам