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

4

我需要使用多线程并行处理表格中的记录。我正在使用C#并针对.NET 2.0。

我知道我可以在.NET 4.0中使用Parallel.ForEach来实现这一点,但我不确定如何在.NET 2.0中实现。


由于在.NET 2中没有Tasks可用,您必须退回到线程来获得所需的内容,您可能需要阅读有关System.Threading命名空间的信息:https://msdn.microsoft.com/zh-cn/library/system.threading(v=vs.80).aspx - Irwene
1
这可能会有所帮助:https://dev59.com/hUbRa4cB1Zd3GeqP03sT - Olivarsham
@Olivarsham 不错的发现,结合线程,楼主可能会得到他想要的。 - Irwene
在.NET 4.0中使用parallel foreach确实是一个糟糕的想法 - 对API的滥用。这是针对大量处理任务而非I/O密集型任务设计的。 - TomTom
给我们一些数字。有多少项?当处理1000万条记录(或超过十几条)时,我看到很多答案完全不适用,因为它们会在不考虑IO的情况下过载CPU。 - TomTom
@TomTom,我没有看到OP在哪里提到了IO。是的,我同意使用线程进行IO操作只是对IO操作缺乏理解,但我在问题中没有看到这一点。 - Sriram Sakthivel
4个回答

0

没有其他要求的情况下,可以通过定义一个函数来实现多线程。

static void Function()
{
    // do some work here
}

然后被另一个线程用作入口点

Thread iThread = new Thread(Function);

并且

iThread.Start();

是一个非阻塞调用,启动另一个线程。


@codor- 如果我想带参数调用函数怎么办? - SAILENDRA SUDA
据我理解,将参数作为参数传递是不可能的;您必须使用静态字段来传递和返回信息。 - Codor

0
你需要使用 ThreadPoolManualResetEvent 来制作自己的实现 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();
    }
}

这里是示例


在循环中使用WaitHandle.WaitAll而不是WaitOne,以避免不必要的唤醒。 - Sriram Sakthivel

0

这里有一个例子,是我在之前的问题回答中提到的,展示了如何启动线程并管理同时运行的线程数量。这应该能为你提供一个开始的框架。


0

在 .Net 4.0 之前,实现并行的推荐方式是使用 "ThreadPool",除非你有特殊的用例。

例如,如果你需要一个“前台线程”或STA线程,则直接使用Thread类。否则,总是使用 ThreadPool。

你可以通过调用 ThreadPool.QueueUserWorkItem 方法来使用 ThreadPool。

然而 QueueUserWorkItem 不提供任何等待完成的方法。如果你想要等待完成,你可以使用 Delegate.BeginInvoke,它会返回一个IAsyncResult(相当于在 .Net 4.0 之前的 Task),这个方法允许你等待完成和更多其他操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接