异步调用服务操作时:
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
}
我的问题:
有没有办法构建一个双工通道并通过回调返回响应,引用提交通道并返回一个响应扔掉它?
答案 0 :(得分:2)
WCF有自己的线程模型。默认情况下,通过调用操作合同来同步处理操作 - 当对操作合同的调用结束时,调用本身也会结束,并且响应将返回给客户端。如果在操作调用中生成一个线程,则必须等待线程完成(阻止操作线程)以返回响应。它可能导致吞吐量问题,因为您可以通过等待调用阻止线程池中的所有线程,并且没有线程可以提供新请求。
作为替代方案,WCF提供了两种额外的机制:asynchronous services和双工服务。在异步服务中,从线程池到服务器获得一个线程,执行一些异步I / O操作的初始请求。当I / O执行开始时,操作的线程返回到线程池以提供其他请求。完成I / O后,操作将从线程池分配给新线程,并调用end方法。操作本身和WCF处理模型仍处理响应 - 您不能手动分叉线程并从不同的线程返回响应。这可以大大提高某种操作的吞吐量。
如果这些型号都不适合您的需求,您需要双工服务,您可以随时回电给客户。
在所有情况下,您都必须处理与频道超时相关的一些问题。