2011-01-05 16 views
18

私は新しいTPL(Task Parallel Library)がParallel.ForEach()を実装しており、「表現された並列性」で動作することを理解します。つまり、デリゲートが複数のスレッドで実行されることを保証するのではなく、ホストプラットフォームに複数のコアがあるかどうかを確認し、真の場合はコア全体に作業を分散させます(基本的にコアごとに1スレッド) 。.NET 4 ... Parallel.ForEach()question

ホストシステムに複数のコアがない場合(そのようなコンピュータを見つけるのが難しくなると)、通常のforeachループのようにコードが順番に実行されます。かなりクールなもの、率直に言って。

通常、私はThreadPoolのからバックグラウンドスレッドで私の長時間実行される操作を配置するために、次のようなものだろう:

ThreadPool.QueueUserWorkItem(新しいWaitCallback(targetMethod)、新しいObject2PassInを());

TPLのParallel.ForEach()は、ホストコンピュータが1つのコアしか持たない状況で自動的にバックグラウンドスレッドに呼び出しを行いますか?あるいは、私は、少なくとも1つのコアコンピュータから実行している場合、少なくともそのロジックがGUIのディスパッチスレッドから外れるように、バックグラウンドのTADコールを起動する必要がありますか?

TPLを担当しているすべての私は、これは、それはまだバックグラウンドスレッドにParallel.ForEach()ループ内のコードをmarshallsそれが単一のコアボックスであることを確認したい場合は、私のGUIをブロックしないように、私がやったように。

あなたが持つかもしれない考えやアドバイスをしてくれてありがとう...

+1

TPL Rocks! TPL通話と「標準」運賃を使用してわずかな調整だけで、さまざまなアプリを作成することができます。私は様々なアイテムの処理時間を80%以上カットしています。 MSは本当にこの1人の偉大な就職仲間の公園からそれをノックアウトしました。 – BonanzaDriver

答えて

19

あなたの仮定が間違っています。
Parallel.Forは、常に、ブロッキングコールです。

コンピュータに複数のコアがある場合でも、すべてのスレッドが終了してから戻ることを待ちます。

UIをフリーズしたくない場合は、常にThreadPoolを明示的に呼び出す必要があります。

+0

クール - ありがとうSLAKs – BonanzaDriver

+3

いつもタスクに貼り付けることができ、完了を待つために継続を使用し、UIに通知します。 –

0

インスタンス/スレッド数について正確な要件がある場合は、自分で行う必要があると思います。私は、Parallel.ForEachタイプの呼び出しが宣言的にコアを関与させるという印象を受けます。私は確かに分かっていませんが、(例として)I/Oをブロックするものにとっては悪い選択であることを卑劣な疑いがあります。

+0

私はこれまで読んだドキュメントから、もともとは「プロセッサに束縛された」問題セットのために考えられました。しかし、これはIO用に使用することを排除するものではありません。実際、TPLを真剣に見ているのは、私が約7,800のWebクエリを実行するアプリを持っているという事実です...私は24GBのRAMを実行しているデュアルクアッドコアプロセッサボックス(3.0GHz Xeons)を持っていますWindows 7の究極の64ビット版では、それらは完了するまで25〜28分かかります。ダウンロードHTMLの追加の処理がありますが、あなたは私の要点を理解しています。私はこれをTPLコールに変更し、5分未満で完了しました。 – BonanzaDriver

0

私はそれがまだ1つのコアだけであってもスレッドを生成すると仮定します。

私は、単一のコアマシンでテストを実行する必要があります。私は1つも持っていないので、私は仮想マシンを使用して、その環境のCPUを1に設定し、Parallel ForEachが生成するスレッドの数を確認します。

あなたは次のことを読むことをお勧めします:

Parallel.ForEachとParallel.Forループとの私の経験を通して

Does Parallel limit the Number of Active Threads

1

、私は、順序は順不同であることができることを希望するかもしれない何かに気づきましたあなたが実装する前に検討する。

製品1 製品2 製品3 製品4

を並列ループは常に生成することはできませんが:このようなループのための基本として

を生成する

製品3 をプロダクト1 プロダクト2 プロダクト4

ちょっと気をつけてください。