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

时间:2012-03-22 11:19:30

标签: c# asp.net-mvc multithreading wcf asp.net-mvc-3

假设:

  • ASP.NET MVC3页面(使用visual studio调试服务器)调用WCF服务(自托管,net.tcp绑定)。
  • 服务使用ThreadPool完成一些工作,但会立即向客户端返回一个值
  • 客户端获取值并重定向到另一个页面。
  • 几秒钟后,服务器因“ObjectDisposedException / Safe句柄已被释放”而崩溃。

首先我认为代理将在页面重定向之后处理,并且wcf服务也会被处理掉,但即使我没有使用ThreadPool(通过调用wcf服务线程中的方法),我也会得到异常太。我不明白。

我不是真的进入网络编程。我做错了什么?

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

protected void Application_Start()
{
  builder.Register(c => new ChannelFactory<IWcfBakeryService >("")).SingleInstance();

  builder.Register(c => c.Resolve<ChannelFactory<IWcfBakeryService>>()
        .CreateChannel())
        .UseWcfSafeRelease();
}


存储库(由Autofac注入的通道)

public BakeryRepository(IWcfBakeryService orderService)
{

}


public ReciepeResponse RequestReciepe(CakeDto webOrder)
{
    [...] 
    return service.RequestReciepe(request);
}



服务器的:
合同

[ProtoBehavior, OperationContract(IsTerminating=false)]
ReciepeResponse RequestReciepe(ReciepeRequest request);


服务实现

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]


RequestReciepe / Service Method

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


异常Stacktrace(由AppDomain UnhandledException捕获)

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()

2 个答案:

答案 0 :(得分:2)

鉴于代码有限,很难肯定地说,但我猜你回调的上下文中的某些内容已经在工作线程实际到达它之前被处理掉了。

答案 1 :(得分:1)

解决。

我的Wcf服务使用现有的业务逻辑。另一个开发人员使用自定义Parallel类的实现来实现多线程目的,它正在调用:

iAsyncResult.AsyncWaitHandle.Close(); 

使用Parallel类的方法不是设计为线程安全的。完成此操作后,所有似乎都能正常工作。