2016-12-25 48 views
-1

有沒有一種方法可以重用用於循環調用呼叫中的線程?我很想做,因爲我明白線程創建可能會很昂貴。Parallel.For/Foreach線程重用C#

,這是我希望做什麼:

var collection = CreateMyCollection() 
var pool = CreateThreadPool() 
for(int i =0 ; i<1000 ; i++) 
     Parallel.ForEach(pool, collection, (element) => Calculate(element, i)) 

這可能嗎?

注:我不能parallize而不是外部環路

+3

我想說'Parallel'方法使用的線程只是來自任務池,所以使用任務本質上應該是重用這些相同的線程。 – Abion47

+0

哇,我會查找文檔,你有鏈接? –

回答

2

Parallel.ForEach(「我的」之間的硬扶養)是TPL一部分。默認TaskSceduler負責將工作項排入線程,將使用ThreadPool。

TaskScheduler類的實例表示任務調度程序。任務調度程序確保最終執行任務的工作。 默認任務調度程序基於.NET Framework 4線程 池,該池爲負載平衡提供工作竊取,線程 注入/退出以獲得最大吞吐量,並且總體良好的性能爲 。在大多數情況下,這應該足夠了。 TaskScheduler類也用作所有可定製調度邏輯的擴展點。這包括如下機制,例如如何將 安排爲執行任務,以及如何將調度任務暴露給調試器。如果您需要特殊功能,您可以 創建自定義調度程序併爲特定任務或查詢啓用它。

+0

非常感謝 –