2010-05-11 20 views
0

我正在运行一个具有2个主要目标的winservice。如何设置WCF线程以进行不同的调度

  1. 执行/处理暴露的webmethods。
  2. 运行消耗CPU分配的内部进程。

的问题是,当我执行许多内部流程|正在排队到线程池或taskpool(如任务)中,webMethods的执行需要更多的时间,WCF还排队其执行相同的线程池。甚至在将内部进程任务优先级设置为最低并将webmethods线程优先级设置为高时也会发生这种情况。

我希望Framework 4.0能够改善这一点,而且他们有,但是如果CPU正在处理其他内部任务,系统仍然需要花费相当长的时间来处理WCF排队的任务。

  1. 是否有可能更改WCF使用的线程池到另一个?
  2. 是否可以手动更改任务队列(全局任务队列,本地任务队列)。
  3. 是否有可能手动处理2个行为不同的任务队列?

任何有关该主题的帮助都将被占用。

吉拉德。

回答

1

请记住,ThreadPool包含两种不同类型的线程:工作线程和I/O完成线程。 WCF请求将由I/O线程提供服务。通过ThreadPool.QueueUserWorkItem运行的任务将在工作线程上运行。所以在这方面,WCF请求和其他CPU任务已经在不同的队列中工作。

您的一些性能问题可能是由您的ThreadPool设置引起的。从MSDN:

线程池保持最小数量的空闲线程。对于工作线程,这个最小值的默认值是处理器的数量。 GetMinThreads方法获取空闲worker和I/O完成线程的最小数量。当所有线程池线程都分配给任务时,线程池不会立即开始创建新的空闲线程。为避免不必要地为线程分配堆栈空间,它会间隔创建新的空闲线程。间隔时间目前只有半秒,但在未来版本的.NET Framework中可能会发生变化。如果应用程序受到大量线程池任务排队的活动突发的影响,请使用SetMinThreads方法增加空闲线程的最小数量。否则,创建新空闲线程的内置延迟可能会导致瓶颈。

我以前肯定经历过上面的瓶颈。有一种名为SetMinThreads的方法,可以让您更改这些设置。顺便说一句,你提到设置线程优先级;但是,我不熟悉改变ThreadPool的线程优先级的机制。你能否详细说明一下?此外,我读过设置线程优先级可能充满危险。

Coding Horror : Thread Priorities are Evil

顺便说一句,有多少处理器/核心是你的机器上运行?

+0

我已经使用SetMinThreads,导致线程池默认生成更多的线程。这部分解决了这个问题,但是导致进程在负载非常低的情况下仍然可以分配线程。当进程中分配的小任务也阻塞了线程池队列时,这并不能完全解决问题。 通过更改线程优先级,可以禁止所有内部线程,并优先考虑来自用户的请求,但只有在线程池执行任务时才有可能。 Thread.CurrentThread.Priority = ThreadPriority.Highest – Gilad 2010-05-23 07:36:42

0

由于您使用的是.NET 4.0,因此您可以通过TPL运行长时间运行的进程。默认情况下,TPL使用.NET线程池执行任务,但您也可以提供自己的TaskScheduler实现。看看samples for the TPL中的示例调度程序实现。我没有亲自使用它,但QueuedTaskScheduler似乎将任务分配给队列,并使用自己的线程池来处理任务。您可以使用它来定义要用于长时间运行的任务的最大线程数。