【问题标题】:Processing records in parallel in .NET 2.0 using multiple threads使用多线程在 .NET 2.0 中并行处理记录
【发布时间】:2016-02-29 10:31:09
【问题描述】:

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

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

【问题讨论】:

  • 由于任务在 .NET 2 中也不可用,你必须依靠线程来获得你想要的东西,你可能想了解System.Threading 命名空间:msdn.microsoft.com/en-us/library/system.threading(v=vs.80).aspx
  • @Olivarsham 不错的发现,结合线程,OP可能会得到他想要的
  • .NET 4.0 中的并行 foreach 确实是个坏主意 - 滥用 API。这适用于繁重的处理任务,而不是 IO 繁重的任务。
  • 给我们一些数字。有多少项?我看到很多答案在您处理 1000 万条记录(或超过一打或两条记录)时完全不合适,因为它们会在不关心 IO 的情况下使 CPU 过载。

标签: c# multithreading .net-2.0


【解决方案1】:

没有任何其他要求,可以通过定义一个函数来实现多线程

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

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

Thread iThread = new Thread(Function);

iThread.Start();

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

【讨论】:

  • @codor- 如果我想用参数调用函数怎么办?
  • 据我了解,将参数作为参数传递是不可能的;您必须使用静态字段来传递和返回信息。
【解决方案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();
    }
}

这里是example

【讨论】:

  • 在循环中使用WaitHandle.WaitAll 而不是WaitOne 以避免不必要的唤醒。
【解决方案3】:

.Net 4.0 之前推荐的实现并行性的方法是“线程池”,除非您有特殊用例。

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

你通过调用ThreadPool.QueueUserWorkItem方法来消耗线程池。

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

【讨论】:

    【解决方案4】:

    这是我的answer to an earlier question 中的一个示例,它显示了如何启动线程并管理一次运行的线程数。这应该会给你一个框架。

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多