广州做网站要多少钱,安卓开发文档,彩票网站建设制作,湖南长沙大学CCR#xff0c;并发与协调运行时(Concurrency and Coordination Runtime)。从名字里我们就可以知道#xff0c;这个东东是用来简化并发程序设计的。为何要并发呢#xff1f;因为我们有多个任务需要处理#xff0c;如果能同时做就会充分利用硬 件而减少处理的时间。自然的并发与协调运行时(Concurrency and Coordination Runtime)。从名字里我们就可以知道这个东东是用来简化并发程序设计的。为何要并发呢因为我们有多个任务需要处理如果能同时做就会充分利用硬 件而减少处理的时间。自然的CCR也是以“任务”为核心进行设计的CCR中的代码也可以分为如下几个功能描述任务、生成任务、调度任务和执行任务。 描述任务 对于计算机来说一个任务就是一段需要执行的代码于是CCR有一个对任务的最抽象描述ITask接口 任务被封装在ITask实例中当CCR调度这个任务实例去执行之后CCR会调用ITask.Execute方法来执行该任务。在ITask接口之下派生出来各种各样的Task 本节讨论的是CCR的整体结构后面我们会具体讨论这些classes。 生成任务 对 于计算机来说任务都是类似的按给定的参数执行一个给定的方法。但是对于程序员来说往往并非这么简单。从时序上来讲任务可以分为这么几种情况算法 和参数都已经齐备的、已知算法等待参数的和已知参数等待算法的。对于第一种情况直接使用Thread或者ThreadPool也可以很方便的解决问题 当然CCR也提供了相应的支持。对于后面两种情况CCR使用了计算过程与参数分离描述的方法来解决。计算机的程序的作用就是处理流程相对固定的事务往 往计算逻辑是有限的而参数是变化无穷的。于是CCR将计算过程与参数分离开来调用者不需要知道如何处理这些参数甚至不需要知道是谁何时来进行处理它 只需要把要计算的数据发送到一个特定的地方即可而这些数据会被可信赖的得以处理。当计算过程接收到适当的参数的时候也就生成了任务。CCR中Port 和PortSet类型就是这样的参数存储器。ReceiverTask及其子类则是封装计算过程的类型Port可以被注册到相应的 ReceiverTask中当有其他用户向Port中投递元素时就会生成任务并放入相应的DispatcherQueue中等待调度。 调度任务 需 要执行的任务是有先来后到、轻重缓急的同时计算机的CPU资源是有限度每个核包括超线程的逻辑核在同一时间只能处理一个线程。这时候就需要进行一 定的调度。为了充分利用CPU自然是要使用多线程来执行任务。如果不使用CCR我们也可以用.net内置的Thread和ThreadPool都可以 用的并行任务调度其中又数ThreadPool用起来比较简单直接把要执行的方法丢进去就好了。但是这简单的背后也存在问题虽然是解决了任务的先来 后到但是没办法分轻重缓急了ThreadPool坚持认定CPU面前人人平等的原则晚来的就是要侯着等先到底执行完。直接用Thread也有问题 就是无法很容易的控制线程的数量以及重用线程而线程本身又是一个比较重型的资源反反复复的创建和销毁很影响效率。为了解决这些问题CCR提出了自己的 任务调度方案。DispatcherQueue。 DispatcherQueue 本质上就是一个任务队列它使得任务按照先来后到的顺序执行。但是你可以创建多个DispatcherQueue比如把高优先级的任务放入一个队列把 普通优先级的放入另外一个那么高优先级的任务不需要等待前面所有普通优先级任务都执行完毕才得到执行。 执行任务 Dispatcher是CCR的执行单元也是一个线程池的实现。既然是线程池那么就必然有它所要管理的工作线程TaskExecutionWorker类封装了Dispatcher中工作线程所要执行的方法以及一些必要的处理。