.NET 4中的multithreading改进

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

基本上问题是运行.NET 4中添加的multithreading任务的新方法是什么?它们设计用于什么?

UPD:为了说清楚,我不是在寻找在.NET 4中运行并行任务的单一方法,我想找出哪些是新增的,并且如果可能的话, 每种情况都是最适合的对于..

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

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

您可以在频道9上看到许多标有“并行计算”的截屏video和video

是的,.NET 4添加了Task Parallel Library ,它在更高层次上增加了对以下内容的支持:

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

回答原始问题的更新……

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

至于知道他们每个人最适合的情况,没有“银弹”答案。 如果您之前正在排队自己的线程池项(或以其他方式执行multithreading),您可以修改代码的这一部分以使用TPL而不会产生任何后果。

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

严格来说,这是C#4.0而不是新类,但事件现在有一种更智能的锁定forms ,如果我已正确理解更改,则无需重锁锁定代码,如下所示(摘自Jon Skeet的这篇文章) ):

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