.NET Framework의 버전에 따라 두 가지 옵션이 있습니다.
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의 버전은 무엇입니까? 닷넷 4의 멀티 쓰레드 프로그래밍에는 큰 발전이있었습니다. – svick
그 중 하나가 포함되어 있어야합니다. 현재 3.5를 목표로하고 있지만,별로 문제없이 4.0으로 갈 수 있습니다. –