WCF异步服务器端处理

时间:2011-11-19 13:50:29

标签: c# .net wcf asynchronous

我需要创建一个接受客户端请求的WCF服务,并在内部连接到远程计算机来完成这项工作。远程机器具有非常好的处理能力但不具有良好的处理速度。这意味着可以处理例如每秒1000个事务,但每个事务可能需要1秒,因此唯一的方法是在同一秒内运行1.000个并发事务。

远程机器很好地处理这种情况,但我担心WCF,如果每个事务都在内部(我不关心客户端模型(同步或异步))等待并阻塞服务器内的线程为1或2这可能代表一个1.000个工作线程,这可能非常危险,或者WCF可能使用线程池,只是将其他请求置于等待状态,这也很糟糕。

所以,我的问题是关于在服务器端异步处理请求的可能性。所以交易流程必须是这样的:

  1. Cliente初始化请求(在他身边是同步请求)
  2. 服务器重新接收请求并将此请求放入事务队列并释放线程
  3. 当任务完成时,服务器完成发送HTTP 200的请求并将结果发送给客户端。
  4. 谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用WCF异步模式来实现此目的。使用async属性标记operationContract时,WCF使用IO CompletionPort线程来处理请求。

所以它按以下方式工作。您的请求由IIS中的线程处理,一旦到达WCF,它就进入休眠状态,然后IO CompletionPort线程接受请求进程,然后将响应发送回IIS线程,该响应将响应返回给客户端。

IO CompletionPort线程更快,并且在性能或资源方面也不会降低服务器速度。

请查看以下link以获取更多信息。

答案 1 :(得分:0)

在中间层服务器中,根据异步模式声明并实现您的操作:

[OperationContract(Action = "DoSomething", AsyncPattern = true)]
IAsyncResult BeginDoSomething(AsyncCallback asyncCallback, object asyncState);
void EndDoSomething(IAsyncResult iar);

BeginDoSomething的实现应该将请求发送到远程机器并立即返回。 当您在客户端调用DoSomething()时,中间层的WCF将意识到此操作是作为异步的Begin / End对实现的,并适当地调用它。