1、后台分类
Thread 、hreadPool、BackgroundWorker、Task
Thread
就是Thread,需要自己调度,适合长跑型的操作。
ThreadPool
是Thread基础上的一个线程池,目的是减少频繁创建线程的开销。线程很贵,要开新的stack
,要增加CPU上下文切换,所以ThreadPool
适合频繁、短期执行的小操作。调度算法是自适应的,会根据程序执行的模式调整配置,通常不需要自己调度线程。另外分为Worker
和IO
两个池。IO线程对应Native的overlapped io
,Win下利用IO完成端口实现非阻塞IO。
BackgroundWorker
是微软的在.net Framwork
中添加的一个组件,主要对线程的访问提供了一种安全的方式。简单的说就是对Thread的一次封装。
Task或者说TPL
是一个更上层的封装,厉害之处在于continuation。continuation
的意义在于:高性能的程序通常都是跑在IO边界或者UI
事件的边界上的,TPL
的continuation
可以更方便的写这种高scalability
的代码。Task会根据一些flag,比如是不是long-running
来决定底层用Thread还是ThreadPool
,另外也做了些细节优化,比如同一个线程跑好几个Task,比如continuation
时根据情况让CPU空转几毫秒来等待前置Task结束,都是为了减少CPU上下文切换。
2、总结
最好使用 Task
Task 停止运行中的任务
使用CancellationTokenSource
类,将其放在方法外,变成全局变量
使用Task时,引入CancellationTokenSource
的Token
,例如:
private ancellationTokenSource cancelSource = new CancellationTokenSource();
Task.Factory.StartNew(delegate { }, cancelSource.Token);
在子线程方法中就可以用Cancel
事件进行取消,但是即使调用了Cancel
事件也只是发了个取消的通知而已,代码实际还会运行,要进行响应操作,例如:
cancelSource.Cancel();
//中断操作
if (cancelSource.IsCancellationRequested)
{
return;
}