Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew_C#_Multithreading_C# 4.0_Threadpool - Fatal编程技术网

C# ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

C# ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew,c#,multithreading,c#-4.0,threadpool,C#,Multithreading,C# 4.0,Threadpool,以下两者之间的区别是什么 ThreadPool.QueueUserWorkItem vs 如果对某个长时间运行的任务调用上述代码500次,是否意味着所有线程池线程都将被占用 或者TPL(第二个选项)是否足够聪明,只占用少于或等于处理器数量的线程?如果要使用TPL启动一个长时间运行的任务,您应该指定,这意味着它不会在线程池中调度它。(编辑:如评论中所述,这是一个特定于调度程序的决定,并不是一个硬性的保证,但我希望任何明智的生产调度程序都能避免在线程池上调度长时间运行的任务。) 您绝对不应该自己在

以下两者之间的区别是什么

ThreadPool.QueueUserWorkItem
vs

如果对某个长时间运行的任务调用上述代码500次,是否意味着所有线程池线程都将被占用


或者TPL(第二个选项)是否足够聪明,只占用少于或等于处理器数量的线程?

如果要使用TPL启动一个长时间运行的任务,您应该指定,这意味着它不会在线程池中调度它。(编辑:如评论中所述,这是一个特定于调度程序的决定,并不是一个硬性的保证,但我希望任何明智的生产调度程序都能避免在线程池上调度长时间运行的任务。)

您绝对不应该自己在线程池上安排大量长时间运行的任务。我相信现在线程池的默认大小相当大(因为它经常以这种方式被滥用),但基本上不应该这样使用

线程池的要点是避免短任务在创建新线程时受到较大的影响,而不是它们实际运行的时间。如果任务将运行很长一段时间,那么创建新线程的影响将相对较小——并且您不希望最终可能耗尽线程池线程。(现在不太可能了,但我确实在早期版本的.NET上体验过。)

就我个人而言,如果我有选择的话,我肯定会使用TPL,因为
任务
API相当不错,但是请记住告诉TPL,您希望任务运行很长时间

编辑:如评论中所述,另请参见PFX团队的博客文章:

最后,我将重申CLR团队的线程池开发人员已经说过的话:

Task is now the preferred way to queue work to the thread pool.

编辑:同样从评论中,别忘了TPL允许你使用,如果你真的想…

我对
TaskCreationOptions的硬性规定很警惕。长时间运行将始终避免线程池。它似乎更像是一个指令,而不是一个实施保证。马克:好吧,这取决于调度程序-但在我看来,在线程池上明确安排长时间运行的任务是一个非常疯狂的调度程序。只需添加一点信息-@Brad:谢谢,将添加一个指向我答案的链接。我还想补充一点,TPL允许您指定自己的调度程序,包括允许您控制自己并发性的自定义调度程序:
Task is now the preferred way to queue work to the thread pool.