Диагностика ObjectDisposedException "Безопасная ручка закрыта"

У меня есть приложение С#, которое попадает в ObjectDisposedException с сообщением

Безопасная ручка закрыта

Это происходит, как только я запускаю приложение.

К сожалению, трассировка стека действительно бесполезна (см. ниже). Есть ли какой-либо способ определить, какой асинхронный вызов был предпринят здесь?

Действительно ли DoAsyncCall() подразумевает вызов метода асинхронного вызова?

mscorlib.dll! System.Threading.EventWaitHandle.Set() + 0xe байты
  mscorlib.dll! System.Runtime.Remoting.Messaging.AsyncResult.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg) + 0x12f байт
  mscorlib.dll! System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Messaging.IMessageSink replySink = {System.Runtime.Remoting.Messaging.AsyncResult}) + 0x279 байт
  mscorlib.dll! System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.DoAsyncCall() + 0x32 байт mscorlib.dll! System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack(объект o) + 0x28 байт
  mscorlib.dll! System.Threading._ThreadPoolWaitCallback.WaitCallback_Context (объект состояние) + 0x2f байт
  mscorlib.dll! System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executeContext, System.Threading.ContextCallback обратный вызов, объект состояние) + 0x6f байт
  mscorlib.dll! System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback tpWaitCallBack) + 0x53 байт
  mscorlib.dll! System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(объект state) + 0x59 байт

Ответ 1

Проблема была вызвана использованием блока using() {}.

    using (WaitHandle handle = asyncResponse.AsyncWaitHandle)
    {
      asyncResponse.AsyncWaitHandle.WaitOne();
      string response = asyncRequest.EndInvoke(asyncResponse);
      asyncResponse.AsyncWaitHandle.Close();
      return response;
    } 

Когда вызывающий поток прерывается, блок использования по-прежнему вызывает Close на WaitHandle.

Ответ 2

Вы удаляете что-то, которое по-прежнему используется другим потоком.