これは 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 コアすべてを自由に使用できます)。