2

スレッドを生成するforループがあります...5つのスレッドを生成し、4に落ちるまで待ってから、別のスレッドを生成します。

基本的に、100レコードある場合、一度に5レコードを処理したいと思います。どちらが好ましいアプローチですか?

4

2 に答える 2

7

推奨されるアプローチは、おそらくこれに組み込まれているメカニズムの1つを使用することです。

たとえば、使用するスレッドの最大数に対応する、使用するMaxDegreeOfParallelismParallel.ForEachを指定するオプションがあります。

これにより、次のように書くことができます。

var options = new ParallelOptions { MaxDegreeOfParallelism = 5 };
Parallel.ForEach(records, options, rec =>
{
    ProcessRecord(rec);
});

「レコード処理」がマッピングまたはクエリ操作である場合、別の適切なオプションは、PLINQのWithDegreeOfParallelismを使用して並列処理を制限することです。

var results = records.AsParallel().WithDegreeOfParallelism(5).Select(r => ProcessRecord(rec)).Where(result => result.Foo); // Some query...

各レコードを「処理」している場合(つまり、ProcessRecordはvoidメソッド)、最初のオプションを選択します。また、ある種のマッピング操作またはレコードに対するクエリを実行し、レコードから結果を返す場合は、2番目のオプションを選択します。レコード処理。

于 2012-06-18T20:00:42.747 に答える
2

ThreadPool私は、それ以上のタスク並列ライブラリ(TPL)を使用することをお勧めします。

于 2012-06-18T20:01:17.723 に答える