好了,所以該解決方案的體系結構將依賴於一兩件事:確實每隊列項的處理時間根據不同項目的數據?
如果沒有,那麼你可以擁有的東西,處理線程之間僅僅是圓知更鳥。這將很容易實現。
如果處理時間也有所不同,那麼你會需要更多的一個「下一個可用」的感覺它的東西,所以無論你的線程恰好是免費的第一被賦予處理數據項的工作。
工作過說出來,然後你將有怎樣一個隊列讀取器和處理線程之間同步的周圍通常運行。 'next-available'和'round-robin'之間的區別在於你如何進行同步。
我不是太熟悉C#,但我聽說獸告訴叫做後臺工作。這很可能是一個可以接受的方法。
對於循環賽,只啓動每個隊列項的後臺工作,在存儲陣列中的工人引用。只限於16位正在進步的後臺工作人員。這個想法是,你已經開始了16,然後等待第一個完成,直到17號開始,等等。我相信後臺工作者實際上是作爲線程池上的作業運行的,所以這會自動地限制實際運行的線程數量,以適應底層硬件的需求。要等待後臺工作人員,請參閱this。等待後臺工作人員完成後,您會處理結果並開始另一個工作。
對於下一個可用的方法,它沒有那麼不同。與其等待第一個完成,您將使用WaitAny()等待任何工作人員完成。你從任何一個完成處理返回,然後開始另一個回到WaitAny()。
這兩種方法的一般理念是保持一些線程一直在沸騰。下一個可用方法的特點是,您發出結果的順序不一定與輸入項目的順序相同。如果那麼重要,那麼比CPU核心擁有更多後臺工作人員的循環方法將會相當高效(線程池將會剛剛開始調試,但還沒有運行的工作人員)。然而,延遲會隨處理時間而變化。
BTW 16是根據您認爲在運行該軟件的PC上有多少核心來選擇的任意數字。更多的核心,更大的數量。
當然,在看似不安定且不斷變化的.NET世界中,現在可能有更好的方法來做到這一點。
祝你好運!
有幾個部分對此,太多地址在一個職位。將任務分解爲更小的部分,然後編寫代碼,然後在遇到較小的部分時發佈更具體的問題。 – mbeckish 2013-03-17 01:12:03
如果你的數據庫是MSSQL 2005或更新的,我建議尋找Service Broker。 – 2013-03-17 01:19:53