2011-11-19 222 views
5

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

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

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

  1. Cliente初始化请求(在他的身边是一个同步请求)
  2. 服务器recive请求,并把交易中的队列此请求,并释放螺纹
  3. 当任务完成时,服务器完成向客户端发送HTTP 200和结果的请求。

谢谢!

+0

如果您在IIS中提供wcf服务,则不需要执行上述任何操作。 IIS将为每个请求推出一个单独的线程,实例化一个新的wcf实例,处理请求并返回结果。如果现有的线程可用,IIS将使用它而不是假脱机一个新的线程。 – edepperson

+0

这不能解决我的线程“饱和”的问题,我需要一个非线程重用的异步处理 –

回答

1

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

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

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

有关更多信息,请参阅以下link

+0

但如何做到这一点。使用简单的参数不可能释放等待来自外部机器的来自数据库o的响应的线程。异步操作必须由开发人员实现,只需开发人员知道异步完成事件后事务是如何恢复的。您响应AIM以避免IIS与WCF之间的线程阻塞,但不会阻止WCF与数据库之间的线程阻塞(例如) –

+0

您是否意味着在进程完成之前您不希望线程被阻塞。在这种情况下,您可以采取IsOneWayOperation,客户只需提出请求并忘记。如果您希望客户端获得响应,请尝试执行全双工场景,其中客户端指定对服务器的回调,一旦处理完成,服务器将执行回调以更新状态。 – Rajesh

+1

我发现可能async/await usign任务类可能是解决方案,我会调查此问题。 –

0

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

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

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