C# WCF ObjectDisposedException安全句柄已发布/ASP.NET MVC3客户端/线程

C# WCF ObjectDisposedException安全句柄已发布/ASP.NET MVC3客户端/线程,c#,asp.net-mvc,multithreading,wcf,asp.net-mvc-3,C#,Asp.net Mvc,Multithreading,Wcf,Asp.net Mvc 3,假设: ASP.NET MVC3页(使用visual studio调试服务器)调用WCF服务(自托管、NET.tcp绑定) 服务使用ThreadPool做一些工作,但会立即向客户端返回一个值 客户端获取该值并重定向到另一个页面 几秒钟后,服务器崩溃,出现“ObjectDisposedException/Safe句柄已释放”) 首先,我认为代理会在页面重定向后被释放,wcf服务也会被释放,但即使我没有使用线程池(通过调用wcf服务线程中的方法),我也会得到异常。我不明白 我不是很喜欢网络编程。

假设:

  • ASP.NET MVC3页(使用visual studio调试服务器)调用WCF服务(自托管、NET.tcp绑定)
  • 服务使用ThreadPool做一些工作,但会立即向客户端返回一个值
  • 客户端获取该值并重定向到另一个页面
  • 几秒钟后,服务器崩溃,出现“ObjectDisposedException/Safe句柄已释放”)
首先,我认为代理会在页面重定向后被释放,wcf服务也会被释放,但即使我没有使用线程池(通过调用wcf服务线程中的方法),我也会得到异常。我不明白

我不是很喜欢网络编程。我做错了什么

客户
Global.asax(注册渠道工厂)



服务器:
合同


服务实现

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

请求接收/服务方法

ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork));
return new ReciepeResponse() { SomeValue = "Some Value"};

异常Stacktrace(由AppDomain UnhandledException捕获)


考虑到有限的代码,很难说清楚,但我猜在工作线程实际到达回调上下文之前,回调上下文中的某些内容已被处理。

已解决

我的Wcf服务使用现有业务逻辑。另一个开发人员使用自定义并行类的实现进行多线程处理,调用:

iAsyncResult.AsyncWaitHandle.Close(); 

使用并行类的方法不是线程安全的。这样做之后,一切似乎都很好。

我认为发布更少的代码会更好,因为可读性。我应该发布什么?很难说,但DoWork的实现可能会有所帮助。解决了问题,但由于声誉限制,无法发布我的答案。so我将在这里发布,直到我可以(大约8小时后…)
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork));
return new ReciepeResponse() { SomeValue = "Some Value"};
bei System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
bei System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
bei Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle handle)
bei System.Threading.EventWaitHandle.Set()
bei System.Runtime.Remoting.Messaging.AsyncResult.SyncProcessMessage(IMessage msg)
bei System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink)
bei System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.DoAsyncCall()
bei System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack(Object o)
bei System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
bei System.Threading.ThreadPoolWorkQueue.Dispatch()
bei System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
iAsyncResult.AsyncWaitHandle.Close();