2017-08-10 75 views
3

鑑於這樣的情況下,低功率的機器上運行:如何查看在Parallel.ForEach循環中引發的線程數?

var logFile = File.ReadAllLines("logpath"); 
var logList = new List<string>(logFile); 

Parallel.ForEach(logList.Batch(8), fileLine => 
{ 
    // work on the 8 lines 
}); 

有一個簡單的辦法,我可以找出在Parallel.ForEach過程中催生的是併發線程的最大數量?

+0

@RenéVogt你介意我補充一點,我的答案嗎? –

+0

「ThreadPool.GetAvailableThreads()」給出了最大池線程數與當前活動線程數之間的差異。沒有嘗試,但可能值得一試。 – Milster

+0

@RenéVogt是的,這正是我希望可能通過ThreadPool或其他方式進行某種內置跟蹤的原因。 –

回答

4

使用Console.WriteLine或Logging跟蹤循環中的每個線程。

Parallel.ForEach(logList.Batch(8), fileLine => 
{ 

    // work on the 8 lines 
    Console.WriteLine("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId); 

}); 
+1

當然我不介意如果你使用這個「想法」,但重要的部分是如何實現它。您展示的方式可能對測試/研究目的有好處。但是如果OP需要高效的解決方案,那麼棘手的部分就是將ID存儲在某個地方,儘可能減少鎖定開銷(因爲併發線程將訪問該ID存儲)。 –

+0

@RenéVogt當然 - 我知道 - 我認爲OP很好奇 - 但也許他們希望它作爲項目的一部分,一般而言 –

+0

@RenéVogt正是如此。另外,我想完成循環並查看任何時候運行的線程的最大數量。對不起,原來的問題沒有說清楚。 –