6
// parameters.Count == 10
// actualFreeLicenses == 2
Parallel.For(0, parameters.Count, new ParallelOptions() 
                    {
                        MaxDegreeOfParallelism = actualFreeLicenses
                    }, i =>
                    {
                        ExternalProgram(i);
                    }
);

上記のコードを実行するiと、メソッドに渡されるの値ExternalProgramが1と6、後で2と7、後で3と8であることがわかります...

14個のパラメータと2個のライセンスがある場合、常に1と8を起動し、後で2と9を起動します...

最初の1と2、後で3と4などの順序を定義することは可能ですか?

4

5 に答える 5

12

キュー/コンカレントキューを使用して、並列ループの本体でアイテムをデキューするのはどうですか?これにより、順序が維持されます。

于 2011-09-29T10:15:07.640 に答える
4

Parallelを使用している場合、それらが実行される順序は重要ではないため、「Parallel」です。順序が適切な場合は、順次ワークフローを使用する必要があります。

于 2011-09-29T09:54:11.243 に答える
2

代わりにカスタムパーティショナーを使用したいようです、実際には「1&6、次に2&7」を実行しているわけではないことを忘れないでください。たとえば、スレッド1で1を実行し、スレッド2で6を実行しています。次に、スレッド2などで7になります。プロセスのペアを起動するわけではありません。Parallel.ForEach

プロセスのグループを起動する場合は、おそらく自分でグループ化を実行してから、グループサイズに等しい最大並列度を指定することにより、グループ内の並列処理のみを提供して、それらのグループを直列にループする必要があります。

于 2011-09-29T09:56:21.537 に答える
1

ForEach(ある範囲の数値を生成した後、おそらくを使用して)を使用するように切り替えることができる場合はIEnumerable.Range、をとるオーバーロードの1つを使用できますPartitioner<T>。その3番目のリンクには、一度に1つの要素を提供するサンプルパーティショナーが含まれています。

于 2011-09-29T09:59:32.060 に答える
1

ランタイムは、使用するスレッドの数を調べて、ワークロードをそれに分割しているように見えます。たとえば、最初のスレッドはデータセットの前半で作業しており、2番目のスレッドはデータの後半で作業しています。

于 2011-09-29T10:02:14.253 に答える