スレッドを生成するforループがあります...5つのスレッドを生成し、4に落ちるまで待ってから、別のスレッドを生成します。
基本的に、100レコードある場合、一度に5レコードを処理したいと思います。どちらが好ましいアプローチですか?
スレッドを生成するforループがあります...5つのスレッドを生成し、4に落ちるまで待ってから、別のスレッドを生成します。
基本的に、100レコードある場合、一度に5レコードを処理したいと思います。どちらが好ましいアプローチですか?
推奨されるアプローチは、おそらくこれに組み込まれているメカニズムの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番目のオプションを選択します。レコード処理。
ThreadPool
私は、それ以上のタスク並列ライブラリ(TPL)を使用することをお勧めします。