BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

实现自定义的任务并行库(TPL)数据流Block

| 作者 Jonathan Allen 关注 547 他的粉丝 ,译者 郑柯 关注 3 他的粉丝 发布于 2012年1月31日. 估计阅读时间: 3 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

数据流Block(Dataflow Block)是.NET 4.5中新的高性能并行处理程序库的支撑核心。尽管其中提供了很多现成的功能,但有时候仍然需要自定义的block。Zlatko Michailov完成了一个文档,其中列出了定制的过程,还指出可能会遇到的诸多陷阱。完整的指南《实现自定义的任务并行库(TPL)数据流Block》可以在Parallel Programming with .NET中找到,我们这里会提供一些重点。

Zlatko提醒:在动手之前,你要先考虑是不是就是把现有的ITargetBlock和ISourceBlock放在一起。如果是的话,Encapsulate函数会给你创建一个新的IPropagatorBlock。该函数会完成大部分的样板代码,但是你仍然要显式声明如何把消息从目标传递到来源block。

要想有更多控制,你可以显式实现ITargetBlockISourceBlock。与大多数抽象接口不同,不是所有的方法都要在实现类的公共接口上暴露出去。有些方法,比如LinkTo和Complete是要被通用代码调用的,而其他像OfferMessage这样的方法,只能被其他block通过抽象接口调用。指南中的5.1节针对每个方法推荐了可见性规则。

接下来Zlatko展示了两个详细的例子。第一个是同步过滤block,第二个是同步变型block。尽管其中有很多样板代码,但的确演示了很多TPL数据流的内部运作机制。

Zlatko谈到异步block时,真正难以对付的代码出现了。你从一开始就要考虑锁层次这样的东西。Zlatko推荐内建block使用的方法,包括一个外发(outgoing)锁,一个进入(incoming)锁和一个值锁(value lock)。

标记一个block为完成,这看起来很简单,只要在调用Complete或Fault时设置Completion属性即可。可一旦开始使用异步block,即使是这样的操作也会很麻烦。比如,实际完成属性设置时,必须保证没有拥有某个锁,因此这可能出发其他的同步代码。

另一个考虑在于:是以贪婪还是非贪婪的方式消费消息。如果使用非贪婪block,那就得采用额外步骤,避免与监听同一个来源的其他目标冲突。

最后,Zlatko谈到了提供消息和链接目标。不过这就简单了,因为所有的操作本意都采取同步方式。

如果想了解更多信息,请查看DevLaps上的TPL数据流网站。

查看英文原文:Implementing Custom TPL Dataflow Blocks

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT