2010-12-13 39 views
5

我們已經找到正在通過2008年WS R2中的IIS(集成模式)運行WCF服務啓動的一些長期運行的業務流程。這些業務流程通常涉及與我們的SQL Server後端的大量交互。我們創建了一個自定義任務隊列實現,通過初始服務調用將請求排隊,然後根據優先級執行。這種執行可能需要很長時間才能完成(極端20-30分鐘)。然後,客戶端可以向服務器查詢他們自己後臺任務的進度。的線程池,相較於長期運行自己的主題處理

在我國目前實施的任務觸發關在一個單獨的線程從ThreadPool中執行,而不是。這是因爲reading recommendations未使用ThreadPool運行長時間運行的任務,以防止遏制ASP.NET請求被服務。我們通過對可同時執行的後臺任務數量設置上限來控制產生的線程數量。這樣我們試圖控制CPU上的負載並防止太多的線程上下文切換。當所有這些都發生時,我們當然仍然需要爲應用程序提供正常的「在線」請求。

在閱讀了Thomas Marquardt的this post之後,我很擔心我們沒有使用ThreadPool,因爲我們無法獲得內置調優啓發式的好處。我們已經通過掛接ApplicationEnd事件並取消長時間運行的任務來解決Thomas提到的關閉問題。所以我的問題是,我們應該切換到使用ThreadPool?這些線程被長時間捆綁在一起呢?如果我正確理解托馬斯,他會說這並不重要,因爲ThreadPool會調整自己以創建更多請求來提供正常的在線操作?我也讀過this StackOverflow question,涵蓋了相同的理由,但我仍然不確定未來的發展方向。

+0

請詳細說明:您認爲您可能會錯過哪些具體調節? – 2010-12-13 06:29:33

+0

也許「調」不是合適的詞,但我指的是如果使用ThreadPool線程執行後臺任務,ThreadPool「將會在系統中增加額外的」負載「由後臺任務完成。如果我們使用普通線程運行它們,ThreadPool就不具備這些知識。再次,我沒有ThreadPool啓發式如何精確工作的內部細節,但通過Thomas的帖子閱讀引起了我的擔憂,即我們通過運行它自己的非-ThreadPool線程 – Carel 2010-12-13 09:49:34

回答

1

這不正是你問 - 但爲什麼不執行在一個單獨的進程您的長時間運行的任務(比如窗口服務)都在一起 - 你無論如何都會建立一個優先級隊列和客戶要查詢回來的結果有些時間過後。如果前端面向WCF服務將請求排隊並對狀態更新查詢作出響應,而後臺服務將繼續提供服務請求,那麼我會採用這種方法。這甚至可以允許工作流程回收等,而不用擔心終止當前正在執行的任務。唯一的問題是我看到的是進程間通信的開銷,但與任務所花費的時間相比,它應該是微不足道的(因爲它們長期運行)。

1

我的建議是要避免,因爲我恰好具有在您所提供的鏈接提示線程飢餓問題的線程池。

我們的產品允許用戶斷火到進行一系列的報價Web服務的調用。這可能是長達40分鐘的長時間運行過程,報價過程是CPU密集型的,所以我們使用我們的四核服務器上的線程池來獲得最大CPU使用率。

但是,由於ASP.NET看起來好像使用線程池爲請求提供服務,我們遇到了一個問題,即用戶提交的任何新作業都會在第一個作業完成時纔會開始,這是由於缺少可用的線程池。爲了解決這個問題,我一直在使用我在前面稱爲ThreadPoolThrottle的網上找到的類。這已經將問題稍微解決了一些,但隨着系統的使用越來越多,我們遇到了同樣的問題。

我現在正在考慮,以防止螺紋飢餓在我的asp.net應用程序運行的報價進程外的VinayC的建議。

相關問題