.NET Frameworkのバージョンに応じて、2つのかなり良いオプションがあります。
ThreadPool.QueueUserWorkItem
はどのバージョンでも使用できます。
int pending = table.Rows.Count;
var finished = new ManualResetEvent(false);
foreach (DataRow row in table.Rows)
{
DataRow capture = row; // Required to close over the loop variable correctly.
ThreadPool.QueueUserWorkItem(
(state) =>
{
try
{
ProcessDataRow(capture);
}
finally
{
if (Interlocked.Decrement(ref pending) == 0)
{
finished.Set(); // Signal completion of all work items.
}
}
}, null);
}
finished.WaitOne(); // Wait for all work items to complete.
.NET Framework 4.0を使用している場合は、Task Parallel Libraryを使用できます。
var tasks = new List<Task>();
foreach (DataRow row in table.Rows)
{
DataRow capture = row; // Required to close over the loop variable correctly.
tasks.Add(
Task.Factory.StartNew(
() =>
{
ProcessDataRow(capture);
}));
}
Task.WaitAll(tasks.ToArray()); // Wait for all work items to complete.
これには他にも多くの方法があります。上記のパターンは、簡単であり、うまく機能するため、強調しています。具体的な詳細がない場合は、いずれかがあなたの状況に完全にマッチするとは言えませんが、それは良い出発点になるはずです。
更新:
私は基準以下の脳活動の短い期間を持っていました。あなたがTPLを利用できるなら、Task
hocus-pocusよりも簡単な方法としてParallel.ForEach
を使うこともできます。
Parallel.ForEach(table.Rows,
(DataRow row) =>
{
ProcessDataRow(row);
});
.Netのどのバージョンをお使いですか? .Net 4のマルチスレッドプログラミングには大きな改善があります。 – svick
これを含めるべきです..現在3.5をターゲットにしていますが、私は大きな問題なく4.0に行くことができます。 –