7

口座番号のリストがあります。Foreach アカウント番号 メソッドを呼び出す必要がありますProcessAccount。処理が必要なアカウントは約 150,000 あり、各アカウントの処理には 0.5 ~ 2 秒かかる場合があります。

たとえば、一度に 4 つのアカウントを処理できるように、どうにかしてスレッドをセットアップしたいと思います。

これに使用できる簡単なパターンはありますか?

私ができるようにしたいのは、最初の 4 つのアカウントを処理する 4 つのスレッドを開始し、個々のスレッドが終了したら、すべてのアカウントが処理されるまで次のアカウントで別のスレッドを開始することです。

4

2 に答える 2

12

これは TPL (Task Parallel Library) で簡単に処理できます。それは次のようになります

ParallelOptions options = new ParallelOptions() { MaxDegreeOfParallelism = 4 };
Parallel.ForEach(accounts, options, a =>
{
    ProcessAccount(a);
});

http://msdn.microsoft.com/en-us/library/dd782721.aspx

TPL は 4 つ未満の同時スレッドを実行することを決定する場合がありますが、指定されたオプションに基づいて 4 つを超えて実行することはありません。たとえば、提供された lamda (ProcessAccount を呼び出す) が CPU バウンドであり、システム上の CPU コアが 4 未満であると判断した場合に、これを実行する可能性があります。一般に、特に .NET 4.5 では、TPL は使用するスレッドの数について非常に適切な決定を下します。

@Servy がコメントで指摘しているように、コードを 4 つのスレッドに制限する非常に具体的な理由がない限り、TPL で使用するスレッドの数を独自に分類することをお勧めします。そうすれば、2018 年に同じコードが 128 コアのプロセッサで実行されている場合、他のことに移ってからずっと後に、128 コアすべてを自由に使用できます)。

于 2012-09-11T18:16:41.423 に答える
1

PLinq を使用します。

var accounts = //some 150,000 account numbers
accounts.AsParallel().ForAll(ProcessAccount);

または、他の引数が必要な場合は、ラムダ式を使用します。

accounts.AsParallel().ForAll(account => ProcessAccount(account, argument2, argument3));
于 2012-09-11T18:18:44.210 に答える