Sim*_*ens 19
它们都在内部使用线程,不同之处在于每个API的抽象级别以及线程的使用方式.让我们重新排序你的列表并查看从最低到最高抽象级别的三种技术:
手动启动新线程:
这实际上在OS中创建了一个新线程.您的代码将在该线程上执行.
使用BackgroundWorker:
在内部,它使用称为.net ThreadPool的东西.线程池基本上是一个可用线程池.您的代码被分配到其中一个可用线程上并在该线程上运行.
池管理可用线程的数量,并在内部创建和销毁某些边界内的线程.这很有用,因为池可以有一些算法来优化线程创建.线程创建是一个非常昂贵的过程,因此如果合适,线程池会保持线程处于活动状态并将其重用于将来的请求.您可以通过指定最小/最大线程数以及类似的一些小调整来对池进行一些有限的控制.
还有其他直接使用ThreadPool的方法,例如QueueUserWorkItem(...).
使用任务并行库:
这是一个更高的抽象.您创建"任务"并告诉TPL执行它们.TPL隐藏了关于确切使用多少线程和优先级的所有问题.TPL能够根据特定的机器性能和可用的CPU资源重用线程并对其进行管理.
例如,给定100个任务,在四核上,TPL可能产生4个线程,但是在8核上它可能产生8并在每个任务完成时将任务分配到可用线程上.
所以回答你的问题.所有3种技术都使用线程,但随着每个级别的上升,对这些线程的控制和感知量会降低.
在大多数情况下,我建议你使用TPL.除非您需要对线程数量及其创建/销毁进行特定的非常精确的控制,否则TPL将非常适合您.
| 归档时间: |
|
| 查看次数: |
1051 次 |
| 最近记录: |