C# - ThreadPool vs Tasks

时间:2009-11-21 06:04:52

标签: c# threadpool task

正如有些人在.NET 4.0中看到的那样,他们已经添加了一个新的命名空间System.Threading.Tasks,它基本上就是手段,一个任务。使用ThreadPool我只使用了几天。

哪一个更有效,资源消耗更少? (或者总体上更好?)

6 个答案:

答案 0 :(得分:23)

Tasks命名空间的目标是提供可插入的体系结构,使多任务应用程序更易于编写和更灵活。

该实现使用TaskScheduler对象来控制任务的处理。这有一些虚拟方法,您可以覆盖这些方法来创建自己的任务处理。方法包括例如

protected virtual void QueueTask(Task task)
public virtual int MaximumConcurrencyLevel

使用默认实现会有很小的开销,因为有一个围绕.NET线程实现的包装器,但我不希望它是巨大的。

自定义TaskScheduler的(草稿)实现在单个线程here上实现多个任务。

答案 1 :(得分:19)

  

哪一个更有效,更少   资源消耗?

不相关,差别很小。

  

(或者总体上更好)

Task类更易于使用,因为它提供了一个非常干净的界面来启动和连接线程,并传输异常。它还支持(有限)形式的负载平衡。

答案 2 :(得分:14)

“从.NET Framework 4开始,TPL是编写多线程和并行代码的首选方式。”

http://msdn.microsoft.com/en-us/library/dd460717.aspx

答案 3 :(得分:5)

调度是并行任务的一个重要方面。

与线程不同,新任务不一定立即开始执行。相反,它们被放置在工作队列中。任务在其关联的任务计划程序将其从队列中删除时运行,通常在核心变为可用时运行。任务调度程序尝试通过控制系统的并发度来优化整体吞吐量。只要有足够的任务且任务完全没有序列化依赖关系,程序的性能就会随着可用内核的数量而扩展。通过这种方式,任务体现了潜在并行性的概念

正如我在msdn http://msdn.microsoft.com/en-us/library/ff963549.aspx

上看到的那样

答案 4 :(得分:4)

裸机,您可能不需要使用它,您可能可以使用LongRunning任务并从其设施中受益。

任务

线程上方的抽象。 使用线程池(除非您将任务指定为LongRunning操作,如果是,则为您创建一个新线程。)

线程池

顾名思义:一个线程池。 .NET框架是否为您处理有限数量的线程。为什么?因为在只有8个内核的CPU上打开100个线程来执行昂贵的CPU操作绝对不是一个好主意。框架将为您维护这个池,重用线程(不是在每次操作时创建/删除它们),并以CPU不会刻录的方式并行执行它们中的一些。

好的,但何时使用每一个?

简历中:始终使用任务。

任务是一种抽象,因此使用起来容易得多。我建议你总是尝试使用任务,如果你遇到一些问题,你需要自己处理一个线程(可能是1%的时间),然后使用线程。

但请注意:

  • I / O绑定:对于I / O绑定操作(数据库调用,读/写文件,API调用等)从不使用正常任务,请使用{{ 1}}任务或线程,如果您需要,但不是正常的任务。因为它会引导你进入一个线程池,其中有几个线程忙,还有很多其他任务等待轮到它。
  • CPU绑定:对于CPU绑定操作,只需使用正常任务即可。

答案 5 :(得分:3)

关于任务的另一个好处是,当你使用ThreadPool时,你没有任何方法可以中止或等待正在运行的线程(除非你在线程方法中手动执行),但使用任务是可能的。如果我错了,请纠正我