根据我对任务和线程之间的区别的理解,任务发生在线程池中,而线程则需要我自己管理。任务可以被取消并在完成其任务后返回到线程池中。
但是在某些博客中,我读到如果操作系统需要创建任务并创建线程,则创建(和销毁)任务将更容易。
有人可以解释一下为什么创建任务比线程简单吗?(或者我可能理解有误...)
根据我对任务和线程之间的区别的理解,任务发生在线程池中,而线程则需要我自己管理。任务可以被取消并在完成其任务后返回到线程池中。
但是在某些博客中,我读到如果操作系统需要创建任务并创建线程,则创建(和销毁)任务将更容易。
有人可以解释一下为什么创建任务比线程简单吗?(或者我可能理解有误...)
因此,请将任务视为待办事项清单中的项目。你可能能够同时完成5件事情,但如果你的老板给你10000件任务,它们就会堆积在收件箱里,直到你正在处理的前5件完成为止。任务与线程池之间的区别在于,任务(如我之前提到的)更好地控制了不同工作项之间的关系(想象一下多个指令钉在一起的待办事项),而线程池只允许你排队一堆单独的、单一阶段的工作项(函数)。
Task
会在ThreadPool
上进行调度,但并非必须如此。如果您使用TaskCompletionSource
创建Task
,甚至可能没有与之直接关联的任何代码。 - svickSystem.Threading.Task
。如果您能稍微扩展一下讨论,包括 TPL 的细微差别,那就太好了。 - Chris Shain从v1.0开始,线程就是.Net的一部分,任务(Tasks)则是在发布于.Net 4.0的任务并行库(Task Parallel Library TPL)中引入的。
你可以将任务视为线程的更高级版本。它们非常易于使用,并具有以下优点:
任务相对于线程的缺点:
一些提示:
始终使用Task.Factory.StartNew方法,这是语义上完美且标准的。
查看任务并行库以获取更多信息 http://msdn.microsoft.com/en-us/library/dd460717.aspx
延伸Eric Lippert的评论:
Thread
是一种允许应用程序并行执行多个任务的方式,例如,应用程序可能拥有一个处理用户事件(如按钮点击)的线程,以及另一个执行某些长时间计算的线程。这样,您就可以“同时”做两件不同的事情。如果没有这样做,用户就必须等到计算完成才能点击按钮。因此,Thread
是可以执行您编写的代码的东西。
而Task
代表了一项抽象的工作,该工作可以有一个结果,并且您可以等待工作结束(通过调用Wait()
)或在工作结束后执行其他操作(通过调用ContinueWith()
)。
最常见的工作是并行执行某些计算,而Task
提供了一种简单的方法来实现。代码实际运行的时间和方式由TaskScheduler
定义。默认的调度器使用ThreadPool
:一组可以运行任何代码的线程。这样做是因为创建和切换线程是低效的。
但是Task
不一定要直接与某些代码相关联。您可以使用TaskCompletionSource
来创建Task
,并在任何时候设置其结果。例如,您可以创建一个Task
,并在用户单击按钮时标记它已完成。一些其他代码可以等待该Task
,而在等待期间,该Task
没有执行任何代码。
如果您想知道何时使用Task
和何时使用Thread
:使用Task
比创建自己的Thread
更简单、更高效。但有时,您需要比Task
提供的控制更多。在这些情况下,使用Thread
直接更有意义。
任务实际上只是手动启动线程的样板代码的包装器。从根本上讲,它们没有区别。任务使线程管理更加容易,并且由于减少了样板噪音,它们通常更具表现力。