抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

1、后台分类

Thread 、hreadPool、BackgroundWorker、Task

Thread就是Thread,需要自己调度,适合长跑型的操作。

ThreadPool是Thread基础上的一个线程池,目的是减少频繁创建线程的开销。线程很贵,要开新的stack,要增加CPU上下文切换,所以ThreadPool适合频繁、短期执行的小操作。调度算法是自适应的,会根据程序执行的模式调整配置,通常不需要自己调度线程。另外分为WorkerIO两个池。IO线程对应Native的overlapped io,Win下利用IO完成端口实现非阻塞IO。

BackgroundWorker是微软的在.net Framwork中添加的一个组件,主要对线程的访问提供了一种安全的方式。简单的说就是对Thread的一次封装。

Task或者说TPL是一个更上层的封装,厉害之处在于continuation。continuation的意义在于:高性能的程序通常都是跑在IO边界或者UI事件的边界上的,TPLcontinuation可以更方便的写这种高scalability的代码。Task会根据一些flag,比如是不是long-running来决定底层用Thread还是ThreadPool,另外也做了些细节优化,比如同一个线程跑好几个Task,比如continuation时根据情况让CPU空转几毫秒来等待前置Task结束,都是为了减少CPU上下文切换。

2、总结

最好使用 Task


Task 停止运行中的任务

使用CancellationTokenSource类,将其放在方法外,变成全局变量
使用Task时,引入CancellationTokenSourceToken,例如:

private ancellationTokenSource cancelSource = new CancellationTokenSource();

Task.Factory.StartNew(delegate { }, cancelSource.Token);

在子线程方法中就可以用Cancel事件进行取消,但是即使调用了Cancel事件也只是发了个取消的通知而已,代码实际还会运行,要进行响应操作,例如:

cancelSource.Cancel();

//中断操作
if (cancelSource.IsCancellationRequested) 
{
     return; 
}