正如有些人在.NET 4.0中看到的那样,他们已经添加了一个新的命名空间System.Threading.Tasks
,它基本上就是手段,一个任务。使用ThreadPool我只使用了几天。
哪一个更有效,资源消耗更少? (或者总体上更好?)
答案 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是编写多线程和并行代码的首选方式。”
答案 3 :(得分:5)
与线程不同,新任务不一定立即开始执行。相反,它们被放置在工作队列中。任务在其关联的任务计划程序将其从队列中删除时运行,通常在核心变为可用时运行。任务调度程序尝试通过控制系统的并发度来优化整体吞吐量。只要有足够的任务且任务完全没有序列化依赖关系,程序的性能就会随着可用内核的数量而扩展。通过这种方式,任务体现了潜在并行性的概念
正如我在msdn http://msdn.microsoft.com/en-us/library/ff963549.aspx
上看到的那样答案 4 :(得分:4)
裸机,您可能不需要使用它,您可能可以使用LongRunning
任务并从其设施中受益。
线程上方的抽象。 使用线程池(除非您将任务指定为LongRunning
操作,如果是,则为您创建一个新线程。)
顾名思义:一个线程池。 .NET框架是否为您处理有限数量的线程。为什么?因为在只有8个内核的CPU上打开100个线程来执行昂贵的CPU操作绝对不是一个好主意。框架将为您维护这个池,重用线程(不是在每次操作时创建/删除它们),并以CPU不会刻录的方式并行执行它们中的一些。
简历中:始终使用任务。
任务是一种抽象,因此使用起来容易得多。我建议你总是尝试使用任务,如果你遇到一些问题,你需要自己处理一个线程(可能是1%的时间),然后使用线程。
答案 5 :(得分:3)
关于任务的另一个好处是,当你使用ThreadPool时,你没有任何方法可以中止或等待正在运行的线程(除非你在线程方法中手动执行),但使用任务是可能的。如果我错了,请纠正我