BT

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

文章:简化异步操作(下)──构建AsyncTaskDispatcher简化多个异步操作之间的协作调用

| 作者 赵劼 关注 4 他的粉丝 发布于 2009年2月25日. 估计阅读时间: 1 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

由于CCR和AsyncEnumerator难以“并行”地执行异步代码,因此我们需要提出新的解决方案来满足这方面的需求。本文将构建一个AsyncTaskDispatcher组件,使多个异步操作之间的协作调用得以大大简化。

与之前的作法相比,似乎代码量提高了,但是观察后可以发现,多出来的代码其实都是在创建匿名的委托对象,而一个个匿名的委托对象将代码进行了有条理 的分割,并充分利用“匿名方法”形成的闭包,使各委托对象能够共享“调用堆栈”上的数据。现在的实现使用了一种直观的方式表现了各异步操作之间的依赖关 系,代码一下子变得条理清晰,易于维护了。此外还有一点非常重要:虽然异步任务为“并行”执行,但是其中所有的委托对象只会依次调用,因此开发人员可以放 心地编写代码,而不用担心线程安全方面的问题。

在AsyncEnumerator的基础上开发一个AsyncTaskDispatcher并不困难,但是这个组件能够有效地简化多个异步操作之间 的协作调用。一般来说,这样的做法能够使应用程序的性能与伸缩性得到比较明显的提高。AsyncTaskDispatcher的代码在MSDN Code Gallery上完全公开,您可以自由修改,使它更好地满足您的需求。

阅读完整文章,请访问:简化异步操作(下):构建AsyncTaskDispatcher简化多个异步操作之间的协作调用

相关文章简化异步操作(上)──使用CCR和AsyncEnumerator简化异步操作

评价本文

专业度
风格

您好,朋友!

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

获得来自InfoQ的更多体验。

告诉我们您的想法

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

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

关于事务的处理 by 张 逸

好文章。

文中提到在执行异步操作时,如果抛出异常,可能会取消异步操作,或等待当前操作执行完毕后,然后取消。不过这里可能会牵涉到事务的问题。老赵提到的场景中,步骤之间除了存在依赖关系外,其实可以看作是一个完整的事务。目前的组件,似乎只有取消,而没有会滚。

Re: 关于事务的处理 by Jeffrey Zhao

End委托有个cancelling参数,如果它是true的话,则表明这个异步操作正在取消,则可以会滚事务。如果把所有操作认为是一个整体的事务话,可以在EndDispatch抛出异常后进行回滚。
实际上这个组件在设计和使用上只考虑了异步读取的情况……希望可以多多讨论,把这个组件的功能补充完整。:)

如果AysncTask的Predicate返回的是DispatchPolicy.MarkedAsSucceeded by 周 威

如果AysncTask的Predicate返回的是DispatchPolicy.MarkedAsSucceeded,在当前Task执行完成之后会执行:dispatcher.StartSuccessors(task),即执行当前任务的后继任务,但是好像没有真正执行吧。还是在dispatcher.GetWorkerEnumerator()方法得以执行当前Task的后继任务的。

允许的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通知我

3 讨论

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


找回密码....

Follow

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

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

Like

内容自由定制

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

Notifications

获取更新

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

BT