Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET 2.0中使用多线程并行处理记录_C#_Multithreading_.net 2.0 - Fatal编程技术网

C# 在.NET 2.0中使用多线程并行处理记录

C# 在.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); 及 是启动另一个线

我需要使用多线程并行处理表中可用的记录。我正在使用C#和targeting.net2.0


我知道我可以使用.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();
    }
}