我有一个相当简单的WCF服务。大多数服务调用在300毫秒或更短时间内执行。这些来电的负载相当轻。
一次"报告"通话是一个长时间(10到15分钟)的通话。它的CPU绑定IO只发生在呼叫的前几毫秒和最后几毫秒。这些报告调用应该是顺序的。
在"报告"打电话,我想轮询服务的进度。我曾经希望简单地设置两个ServiceHosts ...一个用ConcurrencyMode.Single用于长时间运行的报告,一个用ConcurrencyMode.Multiple用于轮询。
然而,一旦"报告"呼叫正在运行(系统CPU固定在100%附近),轮询状态呼叫永远不会进入服务。我曾希望操作系统CPU调度程序会让新请求有一块CPU,但这不是它的样子。
我读过另一个问题,即.NET ThreadPool可能不会在CPU负载过重的情况下产生新线程。 "报告"呼叫转到第三方DLL,所以我没有明显的方法来阻止该过程。
关于如何让轮询调用与长期运行"报告"并行的任何想法调用
(我使用netTcpBinding。)
答案 0 :(得分:1)
我读过另一个SO问题 .NET ThreadPool可能不会产生新的 CPU负载过重的线程。该 “报道”电话会议到第3名 派对DLL,所以我没有明显的 方法来重新扼制这个过程。
它与第三方DLL无关。您仍然可以从另一个线程(具有较低的线程优先级)调用第三方DLL,并使用线程同步原语来睡眠主线程,直到您完成为止。
答案 1 :(得分:0)
如果将Processing操作设置为OneWay,这实际上会创建一个异步调用,然后您可以“轮询”此操作的状态。目前,它将继续等待回复。
我使用类似的过程来插入和处理大型文本文件。