Tùy thuộc vào phiên bản .NET Framework bạn có hai tùy chọn khá tốt.
Bạn có thể sử dụng ThreadPool.QueueUserWorkItem
trong mọi phiên bả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.
Nếu bạn đang sử dụng .NET Framework 4.0, bạn có thể sử dụng 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.
Có nhiều cách hợp lý khác để thực hiện việc này. Tôi làm nổi bật các mẫu ở trên vì chúng dễ dàng và hoạt động tốt. Trong trường hợp không có chi tiết cụ thể tôi không thể nói chắc chắn rằng một trong hai sẽ là một trận đấu hoàn hảo cho tình hình của bạn, nhưng họ phải là một điểm khởi đầu tốt.
Cập nhật:
Tôi đã có một thời gian ngắn hoạt động não xoàng xĩnh. Nếu bạn có sẵn TPL, bạn cũng có thể sử dụng Parallel.ForEach
làm phương pháp đơn giản hơn tất cả các loại Task
hocus-pocus mà tôi đã đề cập ở trên.
Parallel.ForEach(table.Rows,
(DataRow row) =>
{
ProcessDataRow(row);
});
Nguồn
2011-11-17 02:44:46
Bạn đang sử dụng phiên bản .Net nào? Có những cải tiến lớn trong lập trình đa luồng trong .Net 4. – svick
Nên có bao gồm rằng .. Hiện đang nhắm mục tiêu 3,5 nhưng tôi có thể đi 4,0 mà không gặp nhiều rắc rối. –