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 提供两种附加机制:异步服务和双工服务。在异步服务中,从线程池到服务器的初始请求中获取线程,其中执行某些异步 I/O 操作。当 I/O 执行开始时,操作的线程将返回到线程池以处理其他请求。I/O 完成后,将操作分配给线程池中的新线程,并调用 end 方法。操作本身和 WCF 处理模型仍然处理响应 - 您无法手动分叉线程并从不同的线程返回响应。这可以大大提高某些操作的吞吐量。
当这些型号都不适合您的需求时,您需要双工服务,您可以随时回拨给客户端。
在所有情况下,您都必须处理一些与通道超时相关的问题。