开发者

Diagnose ObjectDisposedException "Safe handle has been closed"

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 = {Sys开发者_JAVA百科tem.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


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


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.


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜