0

我的問題可能聽起來有點天真,但我對於多線程編程頗爲新穎。創建.Net 4.0時檢查空閒內核的數量並行任務

我在寫一個處理傳入外部數據的應用程序。對於到達的新任務是通過以下方式創建的每一個數據:

System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data)); 

數據的項目到達速度非常快(每一秒,半秒,等...),創建這麼多的任務。處理每個任務可能需要大約一分鐘。在測試時,我看到線程數量一直在增加。如何限制創建的任務數量,以便實際工作線程的數量穩定高效。我的電腦只有雙核心。

謝謝!

+1

對於多長時間的數據在同一時間到達?意思是,如果你現在得到一些數據,另一個在一秒鐘內,另一個在一秒鐘內,循環運行多久? – 2010-11-01 08:12:02

+0

我問的原因是,如果您每隔一秒(或更快)接收數據很長一段時間,則1分鐘的處理時間將不起作用。在這種情況下,你不能簡單地把所有對象拋到線程池中。相反,我會將所有對象放入一個隊列中(.NET 4.0阻止集合應該在這裏工作),並啓動一些線程來輪詢來自該隊列的工作項。如果你每天24小時都得到數據,你將永遠無法趕上。你確定你在這裏做正確的事嗎? – 2010-11-01 08:40:49

回答

2

你的問題之一是,默認調度程序看到的任務會持續一分鐘,並假定它們被阻塞在尚未執行的其他任務上。爲了嘗試解除阻礙,它會安排更多的待處理任務,從而實現線程增長。有幾件事你可以在這裏做:

  • 使您的任務更短(可能不是一個選項)。

  • 編寫一個處理此場景的調度程序,不會添加更多線程。

  • 使用SetMaxThreads阻止 無限制線程池增長。

參見這裏線程注入的部分:

http://msdn.microsoft.com/en-us/library/ff963549.aspx

0

你應該考慮使用the producer/consumer patternBlockingCollection<T>圍繞ConcurrentQueue<T>你設置BoundedCapacity的東西,有意義給您的工作負載的特性。您可以使您的BoundedCapacity可配置,然後在您通過一些分析會話進行調整以找到最佳位置時進行調整。

儘管第三方物流公司確實會負責排隊完成您創建的任務,但創建太多任務並不是沒有懲罰。另外,生產更多的工作要比你消費的要多少?您希望產生足夠的工作,消費者永遠不會餓死,但是您不希望超越自己,因爲這隻會浪費資源,並且可能會從您的消費者那裏竊取同樣的資源。