【问题标题】:Multithreading improvements in .NET 4.NET 4 中的多线程改进
【发布时间】:2010-04-24 13:20:58
【问题描述】:

我听说 .NET 4 团队在框架中添加了新类,使线程工作变得更好、更容易。

基本上,问题是在 .NET 4 中添加的运行多线程任务的新方法是什么?它们的设计用途是什么?

UPD: 澄清一下,我不是在寻找在 .NET 4 中运行并行任务的单一方式,我想找出哪些是添加了新的,如果可能的话,每个最适合什么情况..

【问题讨论】:

    标签: c# .net multithreading .net-4.0


    【解决方案1】:

    由于缺乏回应,我决定用我所学到的来评估下面的答案。 正如@Scott 所说,.NET 4 添加了任务并行库,它为并行性添加了许多创新、新方法和方法。

    • 首先要提到的是Parallel.ForParallel.ForEach 方法,它们允许开发人员在多个线程中处理多个项目。在这种情况下,框架将决定需要多少线程,以及何时创建新线程以及何时不创建。
      这是并行化现有代码并增加一些性能提升的一种非常简单直接的方法。
    • 另一种方法,有点类似于以前的方法是使用 PLINQ 扩展器。他们采用现有的枚举,并使用并行 linq 扩展器对其进行扩展。因此,如果您有一个现有的 linq 查询,您可以轻松地将其转换为 PLINQ。这意味着 PLINQ 枚举上的所有操作也将利用多线程,例如,使用 .Where 子句过滤对象列表现在将在多线程中运行!
    • TPL 中更大的创新之一是新的Task 类。在某些方面,它可能看起来像众所周知的 Thread 类,但它利用了 .NET 4 中的新线程池(与以前的版本相比有了很大改进),并且比常规的功能更多Thread 班级。例如,您可以链接任务,其中链中间的任务仅在前一个任务完成时才开始。 Channel 9 的截屏视频中的示例和深入解释
    • 要增强任务类的工作,我们可以使用BlockingCollection<>。这在您有生产者-消费者场景的情况下非常有效。您可以让多个线程产生一些对象,然后这些对象将被消费者方法使用和处理。这可以通过任务工厂和阻塞集合轻松并行化和控制。有用的截屏视频,包含来自 Channel 9
      的示例 这些也可以使用不同的后备存储类(ConcurrentQueue、ConcurentStack、ConcurrentBag),它们都是线程安全的,并且在元素排序和性能方面有所不同。不同的video here中的示例和解释
    • 另外一个新添加的东西(它可能不是 TPL 的一部分,但无论如何都对我们有帮助)是 CountdownEvent 类,它可以帮助我们处理“任务协调场景”(c)。基本上允许我们等到所有并行任务完成。在Channel 9 上使用示例的截屏视频

    您可以在第 9 频道看到许多带有"Parallel Computing" 标记的截屏视频和视频

    【讨论】:

      【解决方案2】:

      是的,.NET 4 添加了Task Parallel Library,它在较高级别上增加了对:

      • 使用Parallel.ForParallel.ForEach 运行并行循环
      • 使用Parallel.InvokeTask 类创建或运行任务
      • PLINQ(并行 LINQ 到对象)

      回答对原始问题的更新...

      TPL 是使用 .NET 4 编写并行任务的首选方式。您仍然可以自己创建线程池项,并执行所有与以前相同的“手动”线程技术。要记住的是,整个线程池(以及几乎所有与线程相关的内容)都已被重写以利用 TPL。这意味着即使您自己创建了一个线程池项目,即使您不知道它,您最终仍然会使用 TPL。要记住的另一件事是,TPL 更加优化,并且将根据可用处理器的数量进行更适当的扩展。

      至于知道他们每个人最适合什么情况,没有“灵丹妙药”的答案。如果您之前将自己的线程池项排队(或以其他方式执行多线程操作),则可以修改代码的该部分以使用 TPL 而不会产生任何后果。

      对于诸如并行循环或并行查询之类的事情,您需要分析代码和该代码的执行,以确定它是否适合并行化。

      【讨论】:

      • +1 用于 TPL 参考和几个示例。但是 TPL 是 .NET 中的一个完整库,而我正在寻找更具体的示例..
      • TPL 是一个完整的库,但它是作为 .NET 4 的一部分添加的,并且是在 .NET 4 中编写多线程应用程序的首选方式。看看你的答案和我的相似,我没有看到这不能回答你的问题。
      • 我知道 TPL 是在 .NET4 中添加的,而且我知道这是首选方式。我在 tpl 中询问课程和方法。我的回答描述了其中一些+示例,您只指出了 3 个,根本没有示例/解释。
      【解决方案3】:

      严格来说这是 C# 4.0 而不是一个新类,而是事件now have a smarter form of locking,如果我正确理解了更改,消除需要如下所示的锁定代码(采取来自this article Jon Skeet):

      SomeEventHandler someEvent;
      readonly object someEventLock = new object();
      
      public event SomeEventHandler SomeEvent
      {
          add
          {
              lock (someEventLock)
              {
                  someEvent += value;
              }
          }
          remove
          {
              lock (someEventLock)
              {
                  someEvent -= value;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多