我听说.NET 4团队在框架中添加了新类,可以更好,更轻松地处理线程。
基本上问题是运行.NET 4中添加的多线程任务的新方法是什么?它们设计用于什么?
UPD:为了说清楚,我不是在寻找在.NET 4中运行并行任务的单一方式,我想找出哪些是添加了新的,如果可能的话每个最适合的情况......
答案 0 :(得分:36)
由于缺乏回应,我决定用以下答案评估我已经学到的答案。 正如@Scott所说,.NET 4增加了任务并行库,它为并行性添加了许多创新,新方法和方法。
Parallel.For
和Parallel.ForEach
方法,它们允许开发人员在多个线程中处理多个项目。在这种情况下,框架将决定需要多少线程,何时创建新线程,何时不需要
这是一种非常简单直接的并行化现有代码的方法,并增加了一些性能提升。 .Where
子句过滤对象列表,例如,现在将在多个线程中运行!Task
类。在某些方面,它可能看起来像已知的Thread
类,但它利用了.NET 4中的新线程池(与以前的版本相比已经有了很大的改进),并且比常规Thread
课程。例如,您可以链接任务,其中链中间的任务仅在前一个任务完成时才开始。关于Channel 9 BlockingCollection<>
。这在您拥有生产者 - 消费者场景的情况下非常有效。您可以让多个线程生成一些对象,然后由使用者方法使用和处理。这可以通过Task工厂和阻塞集合轻松地进行并行化和控制。有用的截屏视频,其中包含Channel 9的示例
这些也可以使用不同的后备存储类(ConcurrentQueue,ConcurentStack,ConcurrentBag),它们都是线程安全的,并且在元素排序和性能方面有所不同。它们在不同video here CountdownEvent
类,它可以帮助我们完成“任务协调方案”(c) 。基本上允许我们等到所有并行任务完成。使用Channel 9 您可以在频道9上看到许多标有"Parallel Computing"
的截屏视频和视频答案 1 :(得分:15)
是的,.NET 4添加了Task Parallel Library,它在更高层次上增加了对以下内容的支持:
Parallel.For
和Parallel.ForEach
Parallel.Invoke
或Task
类回答原始问题的更新......
TPL是使用.NET 4编写并行任务的首选方式。您仍然可以自己创建线程池项目,并执行以前所有相同的“手动”线程技术。需要记住的是,整个线程池(以及与线程相关的几乎所有内容)都已被重写以利用TPL。这意味着即使您自己创建了一个线程池项目,您仍然最终会使用TPL,即使您不知道它。另外要记住的是TPL更加优化,并且可以根据可用处理器的数量进行更适当的扩展。
至于知道他们每个人最适合的情况,没有“银弹”答案。如果您之前在排队自己的线程池项目(或以其他方式做多线程的事情),您可以修改您的代码部分以使用TPL而不会产生任何后果。
对于并行循环或并行查询之类的东西,您需要分析代码和该代码的执行情况,以确定它是否适合并行化。
答案 2 :(得分:1)
严格来说这是C#4.0而不是新类,但事件now have a smarter form of locking如果我已正确理解更改,删除需要锁定代码,如下所示(摘自Jon Skeet的this article):
SomeEventHandler someEvent;
readonly object someEventLock = new object();
public event SomeEventHandler SomeEvent
{
add
{
lock (someEventLock)
{
someEvent += value;
}
}
remove
{
lock (someEventLock)
{
someEvent -= value;
}
}
}