2010-07-06 93 views
1

背景:我正在使用.NET 4.0和新的Task類。使用在http://msdn.microsoft.com/en-us/library/ee789351.aspx找到的代碼,我實現了一個任務計劃程序,它限制了執行的併發線程數。我還修改了代碼,使用BlockingCollection而不是LinkedList來完成我的任務列表,以便限制未完成任務列表的大小。我的每個任務都可能產生其他任務。因此,任務A可以產生任務B,C和D.限制自擴展任務

問題:任務A在將任務B,C和D添加到隊列之前不是技術上完成的,但如果隊列已滿, A塊。那麼,我如何擁有一個有限的自我擴展任務的任務隊列呢?

我需要限制隊列大小的原因是否會爆炸我的內存使用。單個任務可以產生數千個其他任務。 10-15個任務每個排隊多達數千...你得到的圖片。

建議將不勝感激!

感謝, 丹

+0

您是否考慮過更改您的任務,以便在實際執行之前不會消耗大量內存?成千上萬的任務對象本身不應該造成問題,但是如果您在排隊前爲每個對象預加載圖像,那麼是的,您將遇到問題。 – 2010-07-06 07:15:01

回答

3

我怎麼有限定的任務隊列自膨脹式的任務

我會說你不知道;也就是說,你的要求是相互衝突的。如果您的必須對待處理任務的數量有嚴格的限制,那麼您必須必須接受嘗試掛起新任務可以阻止(如現在)或失敗。

如果「一個任務可以產生成千上萬的其他任務」,那麼你就一定會有大量待定工作的可能性。任務隊列的目的是充當待處理工作的地方。然而,因爲(我希望)大多數任務不會掛起成千上萬的新任務,隨着時間的推移,待處理的工作量將減少,最終成爲空白。

從某種意義上說,擁有待處理任務隊列的要點之一恰恰在於,可以在不考慮當前可用處理時間的情況下完成新的處理。就內存使用而言,等待隊列中的「數以千計」項目應該不成問題。也許有數百萬人,但即使如此 - 你有沒有分析並證明這是一個問題?

0

我會建議使用有限的'主'隊列,並且任何依賴的任務都在單獨的無限'從'隊列中運行。所以任務A進入「主」隊列,但其他任務在「從」隊列中創建。爲了保持限制,您仍然會停止超過(例如)主隊列中排隊的10個任務:或者如果在主隊列中有超過30個任務,則可以停止將任何內容添加到主隊列中從隊列。

希望有幫助 - 如果您對此答案有任何疑問,請在此發表評論,我將很樂意提供幫助或提供示例!

0

您可能在任務調度程序中有兩個任務列表:PrimaryTasks和SecondaryTasks,每個任務的限制不同。
對主要任務有一個小的限制,但對輔助任務的限制較大。由於輔助任務不擴展,我認爲他們永遠不會阻止,因此主要任務也將完成。