我需要使用多线程并行处理表中可用的记录。我正在使用 C# 并以 .NET 2.0 为目标。
我知道我可以在 .NET 4.0 中使用Parallel.ForEach
来执行此操作,但我不确定如何使用 .NET 2.0 来实现它。
无需任何其他要求,可以通过定义函数来实现多线程
static void Function()
{
// do some work here
}
然后
由Thread iThread = new Thread(Function);
和
iThread.Start();
是启动另一个线程的非阻塞调用。
使用 ThreadPool 和 ManualResetEvent Parallel.Foreach
创建自己的实现。
public class Parallel
{
public static void ForEach<T>(IEnumerable<T> items, Action<T> action)
{
var resetEvents = new List<ManualResetEvent>();
foreach (var item in items)
{
var evt = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((i) =>
{
action((T)i);
evt.Set();
}, item);
resetEvents.Add(evt);
}
foreach (var re in resetEvents)
re.WaitOne();
}
}
这是示例
在 .Net 4.0 之前,建议实现并行的方法是"ThreadPool",除非您有特殊用例。
例如,如果需要"前台线程"或 STA 线程,则可以直接使用 Thread 类。否则,答案总是ThreadPool。
您可以通过调用 ThreadPool.QueueUserWorkItem 方法使用 ThreadPool。
但是QueueUserWorkItem
不提供任何等待完成的方法。如果要等待完成,可以使用Delegate.BeginInvoke,它返回一个IAsyncResult
(大致相当于.Net 4.0之前的任务),该允许您等待完成等等。
这是我对前面问题的回答中的一个示例,该示例显示了如何启动线程并管理一次运行的线程数。这应该给你一个框架开始。