织梦CMS - 轻松建站从此开始!

罗索

Concurrency and Coordination Runtime读后感

罗索客 发布于 2007-01-20 23:15 点击:次 
程序员往往喜欢使用工作线程和同步I/O来模拟异步I/O,因为编写同步I/O的代码非常简单也更加符合人的思考逻辑,只需要把原来的I/O操作封装在一个函数里,然后使用一个工作线程来执行这个函数就可以了。而当使用异步I/O的时候,程序员需要把发起I/O请求和I/O完成处理分开
TAG:

本文是我对MSDN Magazine 2006年9月号中ConcurrentAffairs专栏的读后感
原文作者:Jeffrey Richter,原文链接:http://msdn.microsoft.com/msdnmag/issues/06/09/ConcurrentAffairs/
=========================

微软最近发布了Microsoft Robotics Studio的10月CTP预览版,这个工具包中里面有一个叫做Concurrency and Coordination Runtime (CCR)的基于CLR的类库(CCR.Core.dll)。CCR使得异步编程比传统的多线程编程更加简单。

程序员往往喜欢使用工作线程和同步I/O来模拟异步I/O,因为编写同步I/O的代码非常简单也更加符合人的思考逻辑,只需要把原来的I/O操作封装在一个函数里,然后使用一个工作线程来执行这个函数就可以了。而当使用异步I/O的时候,程序员需要把发起I/O请求和I/O完成处理分开来。而且I/O请求完成的动作难以协调。
CCR库为开发人员极大的简化了这些任务。CCR提供了一系列类,给开发者一个他们可以用简单的表达处理I/O完成操作的复杂的协同模式的简单的对象模型
。此外,CCR提供了高性能线程池,你可以用这个线程池来执行响应I/O完成的任务。当你将CCR和一些新的C#语言特性(比如匿名方法、迭代器)组合使用的时候,你可以很容易的编写响应及时和可伸缩的应用。

看到CCR这些诱人的特性,是不是很开心?别急,在你把CCR集成到你的应用程序之前,你首先要熟悉几个类。

Dispatcher类
实际上Dispatcher类是一个线程池,和CLR内置的线程池一样,它通过delegate来调用方法。Dispatcher默认会为当前机器的每个CPU创建一个线程。与CLR的线程池实现不同的是,Dispatcher中的线程数量是固定的,而CLR的线程池会随需要而增加和减少。


DispatcherQueue类
一个DispatcherQueue维护了一个表示准备执行的方法的delegate的队列,Dispatcher的线程等待着DispatcherQueue中有元素加入,通常DispatcherQueue都是空的,一旦有delegate被加入DispatcherQueue,Dispatcher就会开始执行delegate所指向的方法。当然,如果有一批delegate被加入到队列中,他们会按顺序执行。

根据上面所说的,Dispatcher和DispatcherQueue的行为看起来和CLR的ThreadPool有点象,ThreadPool的QueueUserWorkItem把一个delegate放入队列中。但是在CLR提供的ThreadPool中,如果有1000个delegate已经被放入队列中,新加入一个delegate就必须等待前面的1000个都被执行之后才能得到执行。而在CCR中,你可以使用多个DispatcherQueue,一个用来放置普通的任务,另一个用来放置高优先级别任务,Dispatcher使用round-robin策略从所有的DispatcherQueue中取出元素来执行,也就是说,高优先级的任务不需要等待在它之前已经放入Dispather队列的任务都执行完才能执行。只需要等它自己所处的队列前面的元素执行完成就可以了。

(Jeffrey Richter)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200701/6536.html]
本文出处:microsoft.com 作者:Jeffrey Richter
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容