Диагностика ObjectDisposedException "Безопасный дескриптор закрыт"
У меня есть приложение C#, которое попадает в 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.Remyncessaging + 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(состояние объекта) + 0x59 байт
3 ответа
Проблема была вызвана тем, что я использовал блок using(){}.
using (WaitHandle handle = asyncResponse.AsyncWaitHandle)
{
asyncResponse.AsyncWaitHandle.WaitOne();
string response = asyncRequest.EndInvoke(asyncResponse);
asyncResponse.AsyncWaitHandle.Close();
return response;
}
Когда вызывающий поток прерывается, блок using все еще вызывает Close в WaitHandle.
Вы избавляетесь от чего-то, что все еще используется другим потоком.
Дурачиться с безопасностью на API, и "Пользователи" с ошибкой:
[Authorize(Roles = "User")] // exception...
ObjectDisposedException: безопасный дескриптор был закрыт
Должно было:
[Authorize(Roles = "Users")] // works!
Когда группа не существует, выдается другая ошибка, например:
[Authorize(Roles = "SomeGroupThatDoesNotExist")]
Win32Exception: не удалось установить доверительные отношения между основным доменом и доверенным доменом