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) |