Hello World
Spiga

简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作

2009-02-20 11:25 by 老赵, 10747 visits

在以前的文章中,我曾多次强调应用程序中异步化的重要性。尤其对于IO密集型操作来说,异步执行对于应用程序的响应能力和伸缩性有非常关键的影响。正确使用异步编程能够使用尽可能少的线程来执行大量的IO密集型操作。可惜的是,即使异步编程有避免线程阻塞等诸多好处,但是这种编程方式至今没有被大量采用。其原因有很多,其中最主要的一点可能就是异步模型在编程上较为困难,导致许多开发人员不愿意去做。

异步,则意味着一个任务至少要被拆分为“二段式”的调用方式:一个方法用于发起异步请求,另一个方法用于异步任务完成后的回调。与传统方法的调用方式相比,异步调用时的中间数据不能存放在线程栈上,方法之间的也不能简单地通过参数传递的方式来共享数据。此外,传统方法调用中可使用的 try…catch…finally,using等关键字都无法跨越方法边界,因此异步编程在处理异常,保护资源等方面也需要花更大的精力才行。如果一不小心,轻则造成资源泄露,重则使整个应用程序崩溃。

因此,无论是微软官方还是社区中都出现了一些简化异步编程方式的组件,例如微软的CCR和Wintellect's .NET Power Threading Library中的AsyncEnumerator。但是它们都有同样的局限性,例如操作之间存在依赖,则很难让它们并行执行。对于这样的场景,我们还需要构建额外的解决方案,使多个有依赖关系的异步操作之间的协作调用得以尽可能的简化。

在下一片文章中,我们将构建一个组件来解决这方面的问题。

 

全文地址:简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

34 条回复

  1. 老赵
    admin
    链接

    老赵 2009-02-20 11:26:00

    一个多星期前写好的内容,现在终于可以发布了,呵呵。

  2. brightwang
    *.*.*.*
    链接

    brightwang 2009-02-20 11:31:00

    支持一下!

  3. 老赵
    admin
    链接

    老赵 2009-02-20 11:38:00

    --引用--------------------------------------------------
    brightwang: 支持一下!
    --------------------------------------------------------
    谢谢,InfoQ真是个好地方,可以多关注关注,呵呵。

  4. Kevin-moon
    *.*.*.*
    链接

    Kevin-moon 2009-02-20 11:50:00

    这篇只是一个介绍吧 期待下一篇出现 呵呵

  5. 老赵
    admin
    链接

    老赵 2009-02-20 11:53:00

    --引用--------------------------------------------------
    Kevin-moon: 这篇只是一个介绍吧 期待下一篇出现 呵呵
    --------------------------------------------------------
    对,这篇是介绍现有解决方案,并提出其局限性,下一篇会提出自己的解决方案。

  6. 老赵
    admin
    链接

    老赵 2009-02-20 11:55:00

    @brightwang
    CCR User Guide是比较晦涩的,如果您不需要messaging或Actor Model框架的话,用AsyncEnumerator可以了。这里也只是展示了CCR的一部分功能。

  7. 非空
    *.*.*.*
    链接

    非空 2009-02-20 12:38:00

    介绍的是 Jeffrey Richter 的AsyncEnumerator么?
    还是老赵自己实现的?

  8. 老赵
    admin
    链接

    老赵 2009-02-20 12:51:00

    --引用--------------------------------------------------
    非空: 介绍的是 Jeffrey Richter 的AsyncEnumerator么?
    还是老赵自己实现的?
    --------------------------------------------------------
    是Jeffrey Richter的。

  9. Indigo Dai
    *.*.*.*
    链接

    Indigo Dai 2009-02-20 13:28:00

    老赵很强大,实为一程序员。
    追赶中……

  10. 老赵
    admin
    链接

    老赵 2009-02-20 13:46:00

    --引用--------------------------------------------------
    Indigo Dai: 老赵很强大,实为一程序员。
    追赶中……
    --------------------------------------------------------
    客气客气

  11. 重典
    *.*.*.*
    链接

    重典 2009-02-20 18:17:00

    老赵很让人气不愤:总是把好文章以二段式发布…

  12. Anytao
    *.*.*.*
    链接

    Anytao 2009-02-20 18:31:00

    这也是我想Jeffery提出的,如何思考异步处理对于架构和设计上的权衡问题。

  13. Anonymous22[未注册用户]
    *.*.*.*
    链接

    Anonymous22[未注册用户] 2009-02-20 19:23:00

    今天技术大会中的Demo没演示成功啊,可惜

  14. 老赵
    admin
    链接

    老赵 2009-02-20 20:57:00

    --引用--------------------------------------------------
    重典: 老赵很让人气不愤:总是把好文章以二段式发布…
    --------------------------------------------------------
    其实是一篇,因为InfoQ它一般不发那么长的文章,所以硬生生拆成两片,害得我还要写过渡,写两篇前言总结,麻烦……

  15. 老赵
    admin
    链接

    老赵 2009-02-20 20:58:00

    --引用--------------------------------------------------
    Anonymous22: 今天技术大会中的Demo没演示成功啊,可惜
    --------------------------------------------------------
    那可是相当可惜……

  16. 老赵
    admin
    链接

    老赵 2009-02-20 20:58:00

    --引用--------------------------------------------------
    Anytao: 这也是我想Jeffery提出的,如何思考异步处理对于架构和设计上的权衡问题。
    --------------------------------------------------------
    因此一定要提出异步框架,考虑到使用,优化,排错,而不能直接“裸写”异步程序——其实任何程序都是这样的。

  17. airwolf2026
    *.*.*.*
    链接

    airwolf2026 2009-02-20 21:24:00

    难怪你那天说写好的文章没有发布呢...当时就奇怪哈...
    原来又有外快了.哇哈哈.

  18. 老赵
    admin
    链接

    老赵 2009-02-20 21:52:00

    @airwolf2026
    这个……总归要为infoq贡献内容才行啊,那是个好地方

  19. Indigo Dai
    *.*.*.*
    链接

    Indigo Dai 2009-02-21 12:21:00

    @Jeffrey Zhao
    真话呢,努力的目标呀

  20. fuck[未注册用户]
    *.*.*.*
    链接

    fuck[未注册用户] 2009-02-21 20:20:00

    您好,老赵

    请问如何让aspx页面中不自动生成类似ctl01的ID,生成很多ID,自己不能自由控制。真的很恼火

    我主要是做前端开发的,对页面要求比较干净。目前也正要学着asp.net,因为asp.net生成的页面自己不能自由控制,都有点犹豫继续深入学习的念头,转而想学习一下JSP或是rails,请指点一下。(公司是ROR的)


    现在最期待的就是MVC了,可惜MVC的书要到4月才出来,不知道MVC会不会好点。

  21. 郁闷[未注册用户]
    *.*.*.*
    链接

    郁闷[未注册用户] 2009-02-21 20:31:00

    不好意思,不知咋回事,姓名那里成了不雅的名字。

  22. 老赵
    admin
    链接

    老赵 2009-02-21 20:38:00

    --引用--------------------------------------------------
    fuck: 您好,老赵
    请问如何让aspx页面中不自动生成类似ctl01的ID,生成很多ID,自己不能自由控制。真的很恼火
    我主要是做前端开发的,对页面要求比较干净。目前也正要学着asp.net,因为asp.net生成的页面自己不能自由控制,都有点犹豫继续深入学习的念头,转而想学习一下JSP或是rails,请指点一下。(公司是ROR的)
    现在最期待的就是MVC了,可惜MVC的书要到4月才出来,不知道MVC会不会好点。
    --------------------------------------------------------
    rails也不错啊,值得一学。asp.net mvc所有html都可以控制,至于web form的控件,只要不形成障碍,其实不必强求id如何,没有太大区别的,也不影响使用的(可能样式上有点问题,不过算了吧,用class吧)。当然asp.net web form 4.0也可以自己控制客户端id了。

  23. googleman
    *.*.*.*
    链接

    googleman 2009-02-22 08:25:00

    老赵好!

    我的您的一位忠实观众朱先忠(http://space.itpub.net/14466241/)。想向您请教一个问题(其实,很早就有这个想法),是关于微软ASP.NET AJAX客户端框架的未来前途的。

  24. 老赵
    admin
    链接

    老赵 2009-02-22 14:16:00

    @googleman
    话说到一半?

  25. 韦恩卑鄙
    *.*.*.*
    链接

    韦恩卑鄙 2009-02-22 16:35:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------

    fuck: 您好,老赵

    请问如何让aspx页面中不自动生成类似ctl01的ID,生成很多ID,自己不能自由控制。真的很恼火

    我主要是做前端开发的,对页面要求比较干净。目前也正要学着asp.net,因为asp.net生成的页面自己不能自由控制,都有点犹豫继续深入学习的念头,转而想学习一下JSP或是rails,请指点一下。(公司是ROR的)

    现在最期待的就是MVC了,可惜MVC的书要到4月才出来,不知道MVC会不会好点。

    --------------------------------------------------------

    rails也不错啊,值得一学。asp.net mvc所有html都可以控制,至于web form的控件,只要不形成障碍,其实不必强求id如何,没有太大区别的,也不影响使用的(可能样式上有点问题,不过算了吧,用class吧)。当然asp.net web form 4.0也可以自己控制客户端id了。
    --------------------------------------------------------
    我也觉得只要有很好的命名规范 自动生成的有规律的ClientID 其实是很美观的

    颇同意老赵21号最后一节说的 因为webform 的自动命名而不能运行的功能 本身就是设计失误

  26. lexc[未注册用户]
    *.*.*.*
    链接

    lexc[未注册用户] 2009-02-26 14:29:00

    --引用--------------------------------------------------
    韦恩卑鄙: --引用--------------------------------------------------
    我也觉得只要有很好的命名规范 自动生成的有规律的ClientID 其实是很美观的

    颇同意老赵21号最后一节说的 因为webform 的自动命名而不能运行的功能 本身就是设计失误

    --------------------------------------------------------
    又见师傅发贴哈哈。

    老赵,刚在微软网站上看了一下,最新版ccr&dss是收费的。请问有没有免费版本的?

  27. 老赵
    admin
    链接

    老赵 2009-02-26 14:31:00

    @lexc
    express版本是免费的

  28. lexc[未注册用户]
    *.*.*.*
    链接

    lexc[未注册用户] 2009-02-26 16:00:00

    --引用--------------------------------------------------
    Jeffrey Zhao: @lexc

    express版本是免费的
    --------------------------------------------------------
    可惜的是express版本的license不允许重新分发CCR&DSS Runtime

  29. 老赵
    admin
    链接

    老赵 2009-02-26 16:07:00

    @lexc
    那倒是的,但是允许商用,也就是用在自己的产品中。

  30. lexc[未注册用户]
    *.*.*.*
    链接

    lexc[未注册用户] 2009-02-27 10:53:00

    --引用--------------------------------------------------
    Jeffrey Zhao: @lexc
    那倒是的,但是允许商用,也就是用在自己的产品中。
    --------------------------------------------------------
    我如果开发了个应用,其中只用到了CCR的类库,却必须要安装一个300多M的Microsoft Robotics Developer Studio?

  31. 老赵
    admin
    链接

    老赵 2009-02-27 10:54:00

    @lexc
    CCR有Redistribution Package,几兆大。事实上Robitics Studio也只是装了这个,呵呵。我是在安装时在临时文件夹里找的。

  32. lexc[未注册用户]
    *.*.*.*
    链接

    lexc[未注册用户] 2009-02-27 16:47:00

    @Jeffrey Zhao
    我找找看,谢谢!

  33. guozili@163.com
    *.*.*.*
    链接

    guozili@163.com 2009-03-01 00:56:00

    难道这就是传说中的“把异步同步化,用同步化的写法写异步”
    非常感谢你推荐的这2个框架以及yield结合enumerator的实现思路

  34. 老赵
    admin
    链接

    老赵 2009-03-01 14:43:00

    @guozili@163.com
    是的

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我