在CPU负载下WCF服务无响应

时间:2011-06-30 06:21:44

标签: c# wcf threadpool

我有一个相当简单的WCF服务。大多数服务调用在300毫秒或更短时间内执行。这些来电的负载相当轻。

一次"报告"通话是一个长时间(10到15分钟)的通话。它的CPU绑定IO只发生在呼叫的前几毫秒和最后几毫秒。这些报告调用应该是顺序的。

在"报告"打电话,我想轮询服务的进度。我曾经希望简单地设置两个ServiceHosts ...一个用ConcurrencyMode.Single用于长时间运行的报告,一个用ConcurrencyMode.Multiple用于轮询。

然而,一旦"报告"呼叫正在运行(系统CPU固定在100%附近),轮询状态呼叫永远不会进入服务。我曾希望操作系统CPU调度程序会让新请求有一块CPU,但这不是它的样子。

我读过另一个问题,即.NET ThreadPool可能不会在CPU负载过重的情况下产生新线程。 "报告"呼叫转到第三方DLL,所以我没有明显的方法来阻止该过程。

关于如何让轮询调用与长期运行"报告"并行的任何想法调用

(我使用netTcpBinding。)

2 个答案:

答案 0 :(得分:1)

  

我读过另一个SO问题   .NET ThreadPool可能不会产生新的   CPU负载过重的线程。该   “报道”电话会议到第3名   派对DLL,所以我没有明显的   方法来重新扼制这个过程。

它与第三方DLL无关。您仍然可以从另一个线程(具有较低的线程优先级)调用第三方DLL,并使用线程同步原语来睡眠主线程,直到您完成为止。

答案 1 :(得分:0)

如果将Processing操作设置为OneWay,这实际上会创建一个异步调用,然后您可以“轮询”此操作的状态。目前,它将继续等待回复。

我使用类似的过程来插入和处理大型文本文件。

http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapdocumentmethodattribute.oneway(v=vs.71).aspx