有什么区别:
- 开始一个新线程
- 使用 TPL
- 使用后台工作者
所有这些都创建了并发性,但是它们之间的低级差异是什么?无论如何,这 3 个线程都会创建线程吗?
Thanks
它们都在内部使用线程,区别在于每个 API 的抽象级别以及线程的使用方式。让我们稍微重新排序一下您的列表,并从最低到最高的抽象级别来看看这三种技术:
-
手动启动一个新线程:
这实际上在操作系统中创建了一个新线程。您的代码将在该线程上执行。
-
使用后台工作者:
在内部,这使用了称为 .net 的东西线程池 http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx。线程池基本上是可用线程的池。您的代码被分配到可用线程之一并在该线程上运行。
该池管理可用线程的数量,并将在一定范围内根据需要在内部创建和销毁线程。这很有用,因为池可以有一些算法来优化线程创建。线程创建是一个相当昂贵的过程,因此如果合适的话,线程池会保持线程活动并重用它们以供将来的请求。您可以通过指定最小/最大线程数和一些类似的小调整来对池进行一些有限的控制。
还有其他直接使用线程池的方法,例如队列用户工作项(...) http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx.
-
使用任务并行库:
这是一个更高的抽象。您创建“任务”并告诉 TPL 执行它们。 TPL 隐藏了所有关于到底有多少线程以及将使用什么优先级等的问题。TPL 能够重用线程并根据特定的机器性能和可用的 CPU 资源来管理它们。
例如,给定 100 个任务,在四核上,TPL 可能会生成 4 个线程,但在 8 核上,它可能会生成 8 个线程,并在每个任务完成时将任务分配到可用线程上。
所以来回答你的问题。所有 3 种技术都使用线程,但随着您提升每个级别,您对这些线程的控制和意识都会减少。
在大多数情况下,我建议您使用 TPL。除非您需要对线程数量及其创建/销毁进行特定的非常精确的控制,否则 TPL 将为您很好地处理这一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)