主要的几个概念(详细最好还是看书,配合插图看)
任务是会被分配到线程上的,而这些线程都在线程池引擎下管理
线程池引擎管理着合适数量的线程池,线程从全局队列获取工作项执行。
.NET4 Framework 4改进了全局队列的加入和退出算法,使用了无锁的方式。
通常还是建议使用包装后的Task,但是也是可以直接为ThreadPool加入工作项的,参考代码如下
ThreadPool.QueueUserWorkItem(
(state) =>
{
//...
}, param);
(state) =>
{
//...
}, param);
其中param是一个Object,用于传入参数。而在callback中以state使用。
使用ThreadPool.QueueUserWorkItem,是没法获得要执行的工作项的标识符的。
有一个局部队列的概念,指每个工作线程中的队列。
在主线程或者没有分配任务的线程上下文创建和启动任务,这些任务在全局队列中竞争。
如果是在其他任务的上下文中创建的任务,就会利用局部队列来优化效率。
主要原因是,上下文切换代价大,而且可以保持高速缓存的命中率。
如果有必要的话,可以自行制定任务调度器,参考代码如下。