今天我在使用TPL时发现了一个新类Task。我想知道Task和Thread的区别是什么,它们哪个更好?
任务和线程之间有什么区别?
假设您正在运营一家书籍快递公司。您有四辆车和四个司机。一辆车是一个线程,一个司机是一个处理器,而一本书的交付则是一个任务。您面临的问题是如何有效地安排司机和车辆,以便尽快完成任务。
当汽车(线程)多于司机(处理器)时,情况就会变得奇怪起来。这时司机会在旅途的中途停车(暂停线程)并进入另一辆车(切换上下文),驾驶那辆车并执行任务,最终回到第一辆车。显然,这不如让一个司机留在一辆车里高效。
任务并行的思想是将工作分解为小型任务,这些任务可以未来产生结果,然后有效地分配与处理器数量相同的线程,以避免浪费时间在上下文切换上。实际上,通常情况下并不那么完美,但这就是这个想法。
任务和线程哪个更好?
这个问题不能回答,因为它没有任何意义。哪个更好,交付给客户的书还是用来交付书的车?一辆车是一个可以用来交付书籍的设备;这两个事物不能明智地描述为“比”或“不如”另一个。这就像问“哪个更好,洞还是钻?”
"任务"是一项将在未来执行并完成的工作。
"线程"是执行某事物的方式。
通常情况下,当您创建一个任务时,默认情况下(即使用Task.Factory.StartNew
),该Task
会被安排在ThreadPool线程上的某个时间点运行。然而,并非总是如此。
这种分离的优势在于允许框架(或者如果您使用自定义的TaskScheduler
)控制您的工作如何映射到可用的线程。通常情况下,您可能会有比线程更多的工作项 - 您可能有100万个要处理的项目,但您的系统只有8个内核。在这种情况下,使用固定数量的线程,并使每个线程处理多个工作项,效率要高得多。通过将"任务"与"线程"分开,您正在打破工作==线程的耦合。
总的来说,我建议使用Task
而不是创建自己的线程。这是一种更好、更强大、更灵活的开发模式,特别是它允许您以非常清晰的方式处理异常,生成诸如连续性之类的好东西等等。
以下是一些区别:
Task
默认情况下 使用线程池,而直接使用Thread
将需要创建新线程。Task
将处理异常和结果,因此使用更加容易。Task
可以支持取消操作,而使用线程,则需要自己实现。一个任务指的是您想要执行的操作或工作。
线程可能是执行该工作的执行者或工作者之一。
Thread
类与使用Task<T>
的区别。 - Aliostad