0

异步调用服务操作时:

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 
 } 

我的问题 :

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

4

1 回答 1

2

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

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

当这些模型都不适合您的需求时,您需要双工服务,您可以在需要时回叫客户端。

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

于 2012-04-17T08:52:50.670 回答