2010-05-11 44 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似乎將任務分配給隊列,並使用自己的線程池來處理任務。您可以使用它來定義要用於長時間運行的任務的最大線程數。