至少因为释放的。净4.0,Microsoft似乎已经投入了大量的努力的支持对于平行和异步编程和它似乎是一个很大的Api和图书馆周围这已经出现。尤其是以下花哨的名字都在不断提到的处最近:

  • 反应框架,
  • PLINQ(平行皇宫),
  • TPL(任务并行库)和
  • 并行扩展。

现在他们都似乎是Microsoft的产品和他们似乎都对目标的步或并行程序的情况。网。但是这是不太清楚他们每个人实际上是和他们是如何相互关联的。有些可能实际上是同样的事情。

在几句话,任何人都可以澄清是什么是什么?

有帮助吗?

解决方案

PLINQ (平行皇宫)只是简单一个新的方法来编写定期皇宫查询,以便它们运行并行的,换句话说,该框架将自动照顾的运行查询在多个线程,以便他们更快地完成(即使用多CPU核心).

例如,让我们说你有一大堆的串并且你想要得到所有那些开始用字母"A"。你可以写你的查询是这样的:

var words = new[] { "Apple", "Banana", "Coconut", "Anvil" };
var myWords = words.Select(s => s.StartsWith("A"));

和这个工作正常。如果你有50,000个字来搜索,但是,你可能想利用这一事实,每一个测试是独立的,分裂这个横跨多个核心:

var myWords = words.AsParallel().Select(s => s.StartsWith("A"));

这就是你所需要做的又一个定期查询到一个平行的一个运行在多个核心。相当整洁。


TPL (任务并行库)是一种补充PLINQ,和他们一起弥补的并行扩展。而PLINQ在很大程度上是基于一个 功能 风格的节目 没有 副作用,侧重效果,正是什么TPL。如果你想要真的 做的工作 平行而不只是在寻找/选择的事情并行的,使用的TPL。

TPL本质上是的 Parallel 类暴露了重载 For, Foreach, , Invoke. Invoke 是一个有点喜欢排队任务 ThreadPool, 但一点简单来使用。海事组织,更有趣位是 ForForeach.因此,例如,让我们说你有一大堆的文件,你想来压缩。你可以写定期顺序的版本:

string[] fileNames = (...);
foreach (string fileName in fileNames)
{
    byte[] data = File.ReadAllBytes(fileName);
    byte[] compressedData = Compress(data);
    string outputFileName = Path.ChangeExtension(fileName, ".zip");
    File.WriteAllBytes(outputFileName, compressedData);
}

再次,每次迭代的这种压缩完全独立于任何其他。我们可以加快这样做几个人在一旦:

Parallel.ForEach(fileNames, fileName =>
{
    byte[] data = File.ReadAllBytes(fileName);
    byte[] compressedData = Compress(data);
    string outputFileName = Path.ChangeExtension(fileName, ".zip");
    File.WriteAllBytes(outputFileName, compressedData);
});

再次,这是它所需要的并行这种操作。现在,当我们执行我们的 CompressFiles 方法(或无论我们决定把它叫),它将使用多个CPU核和可能完成一半,或1/4的时间。

这样做的优点只是扔在所有的 ThreadPool 是的,这实际上 运行同步.如果你使用了 ThreadPool 而不是(或只是简单的 Thread 例),您必须想出一个办法找出时的所有任务都完成了,尽管这不是 可怕的 复杂,它的东西,很多人倾向于搞砸了,或至少有麻烦。当你使用 Parallel 班,你真的没有想到它;多线程的方面是隐藏从你这是所有在后台处理。


反应的扩展 (Rx)是一个真正的野兽不同的。这是一个不同的思维方式有关的事件的处理。那里真的很多材料以复盖上这个,但是要做一个很长的故事短,而不是线事件处理程序的事件,Rx让你把序列的事件...好吧,序列(IEnumerable<T>).你得到处理事件在一个迭代方式而不是让他们解雇了异步在随机的时候,你必须保持节省国家所有的时间,以便检测一系列的事件发生在一个特定的顺序。

一个最酷的实例,我们发现的是Rx 在这里,.跳下来的"皇宫来IObservable"部分,在那里,他实现了拖下的处理程序,这通常是一个痛苦WPF中,只有4行代码。Rx给你 组成 事件,有些东西你真的没有与正规事件处理程序和代码段喜欢这些也是简单的重构成的行为类别,你可以套在任何地方。


就是这样。这些都是一些冷却器提供的功能。净4.0.有几个,但这些是你问的关于!

其他提示

我喜欢Aaronaught的答案,但我要说的是Rx和TPL解决不同的问题。一部分,TPL的团队增加是穿元以及显着增强的构建模块的运行时喜欢的线程池.和你的一切清单是建立在这些原语和运行特征。

但TPL和Rx解决两个不同的问题。TPL工作最好当程序的算法或是'拉&排队'.Rx擅长当程序的算法或需要'应'的数据流(如鼠标输入或接收时的流相关信息从一个终点等WCF).

你会需要的'单元的工作'的概念从TPL要做的工作,如文件系统、循环的集合,或步行一个层次结构像一个组织结构图。在这些情况下的程序可以理解的总体工作量,工作可以分解成大块具有一定规模的(任务),并在这种情况下这样做的计算,在一个层次结构的任务可以链式'在一起。所以某些类型的工作借自己的TPL的任务层次'模式,并从中获益,改进水管如取消(见第9频道上的视频CancellationTokenSource).TPL还有很多的旋钮专门领域如接近实时的数据处理。

Rx会是什么大部分开发者应该最终使用。它是如何WPF应用程序可'作出反应'外部信息,如外部数据(流的IM消息的一个客户IM)或外部输入(喜欢的鼠拖例从Aaronaught).在Rx使用穿元从TPL/BCL,线程安全的集TPL/BCL,并且运行的物体,如在线程池.在我心中是Rx的'高级别'的程序,以表达你的意图。

是否平均开发者可以得到他们的头缠绕着组的意图你可以表达Rx尚未看到。:)

但我认为接下来的几年中,TPL与Rx会的下一次辩论就像皇宫-对-SQL与实体的框架。有两种口味的API在同一领域,是专门为不同的方案重叠,但在很多方面。但在的情况下,TPL和接收他们实际上意识到彼此的和有建立在适配器撰写的应用程序和使用的两种框架在一起(如喂养的结果,从一个PLINQ环入IObservable Rx流)。对于那些还没有做任何并行程有一吨的学习,以加快速度。

更新:我一直使用两TPL和RxNet在我的正常的工作过去6个月(18个月以来我原来的答复).我的想法的选择,TPL和/或RxNet在中间层WCF服务(企业LOB服务): http://yzorgsoft.blogspot.com/2011/09/middle-tier-tpl-andor-rxnet.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top