wcf从具有双工的不同线程返回客户端的响应

时间:2012-04-16 18:22:51

标签: c# wcf

异步调用服务操作时:

proxy.OperationCompleted += new EventHandler<OperationEventArgs>(OperationCallback);
proxy.OperationAsync(OperationRequest request);

在服务器端:

 new Thread(new ThreadStart(RunOperations)).Start();

 public OperationResponse Operation(OperationRequest request)
 {
      Queue.Enqueue(request); 
 }

 // in some other thread  
 public OperationResponse RunOperations()
 {
     OperationRequest request = Queue.Dequeue();
     OperationResponse response = Execute(request);
     // here i need to some how return to response to the threw the channel 
     // which sent the request 
 } 

我的问题:

有没有办法构建一个双工通道并通过回调返回响应,引用提交通道并返回一个响应扔掉它?

1 个答案:

答案 0 :(得分:2)

WCF有自己的线程模型。默认情况下,通过调用操作合同来同步处理操作 - 当对操作合同的调用结束时,调用本身也会结束,并且响应将返回给客户端。如果在操作调用中生成一个线程,则必须等待线程完成(阻止操作线程)以返回响应。它可能导致吞吐量问题,因为您可以通过等待调用阻止线程池中的所有线程,并且没有线程可以提供新请求。

作为替代方案,WCF提供了两种额外的机制:asynchronous services和双工服务。在异步服务中,从线程池到服务器获得一个线程,执行一些异步I / O操作的初始请求。当I / O执行开始时,操作的线程返回到线程池以提供其他请求。完成I / O后,操作将从线程池分配给新线程,并调用end方法。操作本身和WCF处理模型仍处理响应 - 您不能手动分叉线程并从不同的线程返回响应。这可以大大提高某种操作的吞吐量。

如果这些型号都不适合您的需求,您需要双工服务,您可以随时回电给客户。

在所有情况下,您都必须处理与频道超时相关的一些问题。