web-dev-qa-db-ja.com

Parallel.ForEachを制限する方法

Parallel.ForEach()非同期ループがあり、それを使っていくつかのWebページをダウンロードします。私の帯域幅は限られているので私は一回にxページしかダウンロードできないが、Parallel.ForEachは希望するウェブページの全リストを実行する。

Parallel.ForEachの実行中にスレッド番号または他の制限を制限する方法はありますか?

デモコード:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});

本当の仕事はウェブページとは無関係なので、クリエイティブなウェブクロールソリューションは役に立ちません。

264
eugeneK

MaxDegreeOfParallelismパラメーターにParallelOptionsを指定できます。

Parallel.ForEach(
    listOfWebpages,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    webpage => { Download(webpage); }
);

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

500
Nicholas Butler

ParallelOptionsを使用してMaxDegreeOfParallelismを設定すると、同時スレッド数を制限できます。

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});     
36
rikitikitik

ParallelOptions インスタンスをとるParallel.Foreachの別のオーバーロードを使用し、MaxDegreeOfParallelismを設定して、同時に実行されるインスタンス数を制限します。

20
Richard

そしてVB.netユーザーのために(構文は奇妙で見つけにくい)...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)  
8
user3496060