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

Processing records in parallel in .NET 2.0 using multiple threads

提问人:SAILENDRA SUDA 提问时间:2/29/2016 最后编辑:Cody Gray - on strikeSAILENDRA SUDA 更新时间:3/3/2016 访问量:1906

问:

我需要使用多线程并行处理表中可用的记录。我正在使用 C# 并以 .NET 2.0 为目标。

我知道我可以在 .NET 4.0 中执行此操作,但我不确定如何使用 .NET 2.0 实现它。Parallel.ForEach

C# 多线程处理 NET-2.0

评论

0赞 Irwene 2/29/2016
由于任务在 .NET 2 中也不可用,因此必须依靠线程才能获得所需的内容,因此可能需要阅读有关命名空间的信息:msdn.microsoft.com/en-us/library/system.threading(v=vs.80).aspxSystem.Threading
1赞 Olivarsham 2/29/2016
这可能会有所帮助 stackoverflow.com/questions/523194/parallel-iteration-in-c
0赞 Irwene 2/29/2016
@Olivarsham不错的发现,结合线程,OP 可能会得到他想要的
0赞 TomTom 2/29/2016
.NET 4.0 中的 paraallel foreach 确实是一个坏主意 - 滥用 API。这适用于繁重的处理任务,而不是 IO 繁重的任务。
0赞 TomTom 2/29/2016
给我们一些数字。有多少件商品?我看到很多答案在你处理 1000 万条记录(或超过十几两条)的那一刻完全不合适,因为它们会在不关心 IO 的情况下使 CPU 过载。

答:

0赞 Codor 2/29/2016 #1

无需任何其他要求,可以通过定义函数来实现多线程

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

然后将其用作不同线程的入口点

Thread iThread = new Thread(Function);

iThread.Start();

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

评论

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

您需要使用 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();
    }
}

下面是示例

评论

0赞 Sriram Sakthivel 2/29/2016
使用而不是循环以避免不必要的唤醒。WaitHandle.WaitAllWaitOne
0赞 Sriram Sakthivel 2/29/2016 #3

在 .Net 4.0 之前,除非有特殊用例,否则实现并行性的推荐方法是“ThreadPool”。

例如,如果需要“前台线程”或 STA 线程,则直接使用 Thread 类。否则,答案始终是 ThreadPool。

通过调用 ThreadPool.QueueUserWorkItem 方法使用 ThreadPool

但是,不提供任何等待完成的方法。如果你想等待完成,你可以使用 Delegate.BeginInvoke,它返回一个(大致相当于 .Net 4.0 之前的 Task),它允许你等待完成等等。QueueUserWorkItemIAsyncResult

0赞 Ed Power 3/3/2016 #4

这是我回答前面一个问题的示例,它显示了如何启动线程并管理一次运行的线程数。这应该给你一个框架。