2012-04-25 74 views
0

這可能不適合在這裏,如果是這樣,請隨時移動,呼喊或濫用。處理許多任務,多次與任務並行

我們目前有一個控制檯應用程序,由另一個開始並傳入一個「作業」ID,這個作業將有多個需要處理的記錄。流程的簡單解釋是;

Starts 50 threads 

Gets records to be processed. 
if records > 0 see what threads are not still busy and send it some information. 
if records = 0 update something else and exit. 
Get more records. 
Loop. 

現在,我正在尋找轉換成一個'輪詢'服務,不斷運行,當新記錄可用,處理它們。採取我擁有的東西並將其轉換成相當簡單,但線程的東西是舊的,可​​能過時了。

我正在尋找重構大部分,如果不是全部,並使用Task.Parallel來處理項目。然而,我正在努力爭取一個合適的輪詢框架,然後處理這些項目,並正在尋求如何實現這一目標的建議。

我非常模糊,但希望能給出某種意見。

非常感謝

+0

你能描述這些記錄來自哪裏嗎?他們被添加到數據庫? – 2012-04-25 14:06:24

+0

目前他們是名單,但是他們最終來自DB。它們分批加載併發送到線程池。一旦在該批次中沒有剩下可處理的東西,我們會檢查更多。 – ChrisBint 2012-04-25 14:08:37

+0

這是說話的sql服務器? – 2012-04-25 14:10:50

回答

1

從我的經驗,這msdn報價:

更高效,更可擴展的系統資源的使用。

在幕後,任務排隊等待ThreadPool,這已被 增強,算法(如爬山)確定和 調整爲最大化吞吐量的線程數。這使得 任務相對輕量級,並且您可以創建其中的許多任務來啓用細粒度並行。爲了補充這一點,採用廣爲人知的工作竊取算法來提供負載平衡。

你根本不應該關心有多少任務是一個好數字,或者如何創建一個負載均衡涉及的線程的系統。

只需使用:要異步運行的東西

Task.Factory.StartNew(() => DoSomeWork()); 

每一次,它幕後所有的智能工作。

現在,因爲你可能會創建一個循環任務,請要額外小心沒有引進一個封閉的錯誤許多人不得不(包括我),你可以看一下here

我有一個Windows服務,運行從1到500任務,並從來沒有麻煩。

希望這會有所幫助,

Bab。

+0

500任務可能沒問題,但我不確定10000是什麼。 – svick 2012-04-25 16:59:25

0

「輪詢服務」聽起來像是一個可觀察集合的好例子。有Rx,一種處理它們的好方法(http://rxwiki.wikidot.com/101samples),我認爲它使用TPL。

1

如果您正在查詢數據庫表中的新記錄,更好的方法是在此表上安裝INSERT觸發器(也可能還有UPDATE和DELETE觸發器),並在您的服務發送消息時插入新記錄。

請參閱MSDN上的Posting Message to MSMQ from SQL Server

+0

+1爲觸發器。如果你有一個數據庫,你可以使用它的功能。 – 2012-04-25 15:55:26