2011-01-05 130 views
18

我知道新的TPL(任務並行庫)已經實現了Parallel.ForEach(),因此它可以與「表達的並行性」一起工作。這意味着,它並不能保證你的委託將運行在多個線程中,而是檢查主機平臺是否有多個內核,如果是的話,它只能在整個內核中分配工作(每個內核基本上只有1個線程) 。.NET 4 ... Parallel.ForEach()問題

如果主機系統沒有多個核心(越來越難找到這樣的計算機),那麼它會像「常規」foreach循環那樣按順序運行你的代碼。坦率地說,非常酷的東西。

通常我會做類似下面放置從線程池在後臺線程我長時間運行的操作:

ThreadPool.QueueUserWorkItem(新WaitCallback(targetMethod),新Object2PassIn());

在主計算機只有一個核心的情況下,TPL的Parallel.ForEach()會自動將調用放在後臺線程上嗎?或者,我是否應該從後臺管理員那裏調用任何TPL調用,以便如果我從一臺核心計算機執行,至少該邏輯將不在GUI的調度線程中?

我擔心的是,如果我讓TPL負責這一切,我想確保它是否確定它是一個單核心框,它仍然將在Parallel.ForEach()循環內部的代碼編組到後臺線程中就像我會做的一樣,以免阻塞我的GUI。

感謝您的任何想法或意見...

+1

只需快速跟進:TPL Rocks!無法通過使用TPL呼叫與「標準」票價進行一些小的調整,就能夠讓我能夠製作各種應用程序的速度快得多。我正在關注削減80%以上的各種物品的加工時間。 MS真的把它從這個公園裏淘汰出去了 - 很棒的工作人員。 – BonanzaDriver 2011-01-06 01:52:56

回答

19

你的假設是不正確的。
Parallel.For總是阻塞呼叫。

即使計算機有多個核心,它仍然會等待所有線程完成後才返回。

如果您不想凍結UI,您將始終需要顯式調用ThreadPool。

+0

酷 - 謝謝SLaks – BonanzaDriver 2011-01-05 02:32:34

+3

可以隨時將其粘貼到一個任務,並使用延續等待它的完成,然後通知用戶界面。 – 2011-01-05 02:52:54

0

我想如果你有關於實例/線程數的確切需求,你需要自己動手。我得到的印象是,Parallel.ForEach類型的調用是用於聲明性地獲取核心。我不確定,但我有一個鬼鬼祟祟的懷疑,這是阻止I/O(作爲一個例子)的東西不好的選擇。

+0

從我迄今爲止閱讀的文檔中,它最初是爲「處理器邊界」問題集構想的。但是,這並不排除將它用於IO。事實上,讓我認真看待TPL的事實是,我有一個應用程序,可以執行大約7,800個網頁查詢......我有一個運行24GB RAM的雙核四核處理器盒(3.0 GHz Xeon)在Windows 7旗艦版64位版本...和那些需要約25至28分鐘才能完成。還有一些額外的下載HTML處理,但你明白我的觀點。我將其改爲TPL呼叫,耗時<5分鐘。 – BonanzaDriver 2011-01-05 02:39:24

0

好問題。我認爲即使只有一個核心,它仍會產生一個線程。我將不得不在一臺核心機器上運行測試。由於我沒有,我將使用虛擬機並將其環境CPU設置爲1,並查看Parallel ForEach會產生多少線程。

您可能需要閱讀以下內容:

Does Parallel limit the Number of Active Threads

1

通過我與Parallel.ForEach和經驗的Parallel.For循環,我已經注意到了,爲了能進能出的順序,有些東西你可能想在實施之前考慮。

如用於迴路中的基本會產生:

產品1 產品2 產品3 產品4

和並聯循環能產生,但並不總是:

產品3 產品1 產品2 產品4

只要記住小夥子們。