C# 在.NET 2.0中使用多线程并行处理记录
我需要使用多线程并行处理表中可用的记录。我正在使用C#和targeting.net2.0C# 在.NET 2.0中使用多线程并行处理记录,c#,multithreading,.net-2.0,C#,Multithreading,.net 2.0,我需要使用多线程并行处理表中可用的记录。我正在使用C#和targeting.net2.0 我知道我可以使用.NET 4.0中的Parallel.ForEach来实现这一点,但我不确定如何使用.NET 2.0实现它。如果没有任何其他要求,可以通过定义函数来实现多线程 static void Function() { // do some work here } 然后将其用作不同线程的入口点 Thread iThread = new Thread(Function); 及 是启动另一个线
我知道我可以使用.NET 4.0中的
Parallel.ForEach
来实现这一点,但我不确定如何使用.NET 2.0实现它。如果没有任何其他要求,可以通过定义函数来实现多线程
static void Function()
{
// do some work here
}
然后将其用作不同线程的入口点
Thread iThread = new Thread(Function);
及
是启动另一个线程的非阻塞调用。您需要使自己的实现
并行。Foreach
使用and
公共类并行
{
公共静态void ForEach(IEnumerable items,Action-Action)
{
var resetEvents=新列表();
foreach(项目中的var项目)
{
var evt=新手动重置事件(错误);
ThreadPool.QueueUserWorkItem((i)=>
{
作用((T)i);
evt.Set();
},项目);
resetEvents.Add(evt);
}
foreach(重置事件中的var re)
re.WaitOne();
}
}
以下是.Net 4.0之前的推荐的实现并行性的方法是“线程池”,除非您有特殊的用例 例如,如果您需要“前台线程”或STA线程,则直接使用Thread类。否则,答案总是ThreadPool 您可以通过调用方法使用线程池
但是,
QueueUserWorkItem
不提供任何等待完成的方法。如果您想等待完成,可以使用它返回一个IAsyncResult
(大致相当于.Net 4.0之前的任务),它允许您等待完成和更多。下面是my中的一个示例,演示如何启动线程和管理一次运行的线程数。这应该为您提供一个框架作为起点。由于.NET 2中也没有可用的任务,因此您必须依靠线程来获得所需的内容,您可能需要了解系统。线程
命名空间:这可能有助于@Olivarsham nice find,并结合线程,OP可能会得到他想要的东西.NET4.0中的Parallel foreach真是个坏主意——滥用API。这是针对繁重的处理任务,而不是IO繁重的任务。请给出一些数字。有多少项?当你处理1000万条记录(或十几条或两条以上的记录)时,我发现很多答案完全不合适因为它们会在不关心IO的情况下过载CPU。在循环中使用WaitHandle.WaitAll
而不是WaitOne
,以避免不必要的唤醒。@codor-如果我想用参数调用函数怎么办?据我所知,将参数作为参数传递是不可能的;您必须使用静态字段来传递和返回信息。
iThread.Start();
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();
}
}