Diagnose ObjectDisposedException “Safe handle has been closed”

雨燕双飞 提交于 2020-01-23 04:31:06

问题


I have a C# application which is hitting an ObjectDisposedException with the message

Safe handle has been closed

This happens as soon as I launch the application.

Sadly the stack trace is really unhelpful (see below). Is there any way for me to determine what call was being attempted asynchronously here?

Does DoAsyncCall() really imply an async method call?

mscorlib.dll!System.Threading.EventWaitHandle.Set() + 0xe bytes
mscorlib.dll!System.Runtime.Remoting.Messaging.AsyncResult.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg) + 0x12f bytes
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 bytes
mscorlib.dll!System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.DoAsyncCall() + 0x32 bytes mscorlib.dll!System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack(object o) + 0x28 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(object state) + 0x2f bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback tpWaitCallBack) + 0x53 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object state) + 0x59 bytes


回答1:


The problem was caused by my use of a using(){} block.

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

When the calling thread is interrupted the using block is still calling Close on the WaitHandle.




回答2:


You are disposing something which is still being used by a different thread.




回答3:


Goofing around with security on API, and misspelled "Users":

[Authorize(Roles = "User")] // exception...

ObjectDisposedException: Safe handle has been closed

Should have been:

[Authorize(Roles = "Users")] // works!

A different error is thrown when group does not exist, like:

[Authorize(Roles = "SomeGroupThatDoesNotExist")]

Win32Exception: The trust relationship between the primary domain and the trusted domain failed



来源:https://stackoverflow.com/questions/4473216/diagnose-objectdisposedexception-safe-handle-has-been-closed

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!