多队列多优先级任务调度组件。
Falcon.TaskScheduling | ||
Falcon.TaskSchedulingTests | ||
.gitignore | ||
Falcon.TaskScheduling.sln | ||
README.MD |
多线程多优先级任务调度组件
- 首先需要实现ITaskUnit接口。这个接口包含一个用来执行任务的Run方法和一个处理任务结果的TaskCallback方法。Run方法返回结果会作为result参数传递给TaskCallback方法。
- 第二步需要实例化一个任务调度器ConcurrentQueueTask,它实现了ITaskScheduler接口。
- 获得ITaskScheduler对象后可以调用相关的AddXXXXQueue方法将任务单元ITaskUnit加入队列。
- 调用ITaskScheduler的Start()方法开始执行任务调度,组件会根据加入的任务优先级按顺序执行Run方法,并在完成后调用依次调用TaskCallback。
- 调用的顺序一般不予加入的顺序相同,只跟加入的优先级队列有关。
下面介绍队列:
- System队列:该队列具有最高优先级,一般用来执行系统同步任务。任务加入队列后将在下次调度发生后马上执行。
- First队列:该队列优先级低于System队列,一般用来执行需要优先执行的任务,System中没有任务后开始执行。
- Queue一般级队列组:该组包含若干队列,处于该组队列中的任务会在system和First队列中没有任务后执行。具体执行哪个任务取决于队列的命中率,该命中率有weight决定。该值越大命中率越高。
- Idel队列:空闲队列,当System、First和Queue队列均无任务可执行后开始执行。
注意点:
- 只有执行Start方法后才开始调度任务,并且在所有任务完成后结束调度,如果结束调度后再次加入新的任务需要再次调用Start方法重新开始调度。
- 任务执行Run中抛出的异常会传入TaskCallback方法进行处理。TaskCallback中抛出的异常不会处理并且会结束整个任务调度。