Según la versión de .NET Framework tiene dos opciones bastante buenas.
Puede usar ThreadPool.QueueUserWorkItem
en cualquier versión.
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.
Si está utilizando .NET Framework 4.0 se puede utilizar el 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.
Hay muchas otras formas razonables de hacerlo. Destaco los patrones anteriores porque son fáciles y funcionan bien. A falta de detalles específicos, no puedo decir con certeza si alguno de los dos será una combinación perfecta para su situación, pero deberían ser un buen punto de partida.
Actualización:
tuve un corto período de actividad cerebral insatisfactoria. Si tiene el TPL disponible, también podría usar Parallel.ForEach
como un método más simple que todo lo que mencioné anteriormente en Task
hocus-pocus.
Parallel.ForEach(table.Rows,
(DataRow row) =>
{
ProcessDataRow(row);
});
¿Qué versión de .Net utiliza? Hay grandes mejoras en la programación multiproceso en .NET 4. – svick
Debería haber incluido eso .. Actualmente apuntando a 3.5 pero puedo ir a 4.0 sin muchos problemas. –