WCF 从不带双工的不同线程向客户端返回响应

本文关键字:线程 客户端 返回 响应 WCF | 更新日期: 2023-09-27 18:31:13

异步调用服务操作时:

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 
 } 

我的问题 :

有没有办法不构造双工通道并通过回调返回响应,引用提交通道并返回抛出的响应?

WCF 从不带双工的不同线程向客户端返回响应

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

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

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

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