我正在尝试理解.net中的任务,我理解的是它们比线程更好,因为它们代表了需要完成的工作,当有空闲线程时它就会被拾取并继续工作完全可用的cpu。
我在新的mvc 5项目中看到Task<ActionResult>
,我想知道为什么会这样?
总是这样做是否有意义,或者只是在函数中有阻塞工作时才有意义?
我猜测,因为这确实像一个线程,仍然有可能需要的同步对象这是正确的吗?
答案 0 :(得分:5)
MVC 5使用Task<ActionResult>
来允许它完全异步。通过使用Task<T>
,可以使用新的async
和await
语言功能实现这些方法,这些功能允许您以简单的方式使用MVC组合异步IO函数。
在使用MVC时,一般来说,Task<T>
希望不使用线程 - 它们将组成异步操作(通常是IO绑定工作)。通常,在服务器上使用线程会降低整体可伸缩性。
答案 1 :(得分:3)
Task
不代表线程,甚至是逻辑上的。它不仅仅是线程的替代实现。这是一个更高层次的概念。 Task
表示将在某个时间点(通常在将来)完成的异步操作。
该任务可以表示在另一个线程上运行的代码,它可以表示依赖于OS中断的某些异步IO操作(间接地,通过一些其他间接层)导致任务被标记为已完成),它可能是完成其他两个任务的结果,或者其他任务的继续完成,可能表明下一个事件何时触发,或者某个自定义TaskCompletionSource
谁知道它的实现是什么。
但是你不必担心所有这些选择。那是点。在其他模型中,您需要以不同方式处理所有这些不同类型的异步操作,从而使异步程序复杂化。 Task
的使用允许您编写可以使用任何类型的异步操作轻松编写的代码。
我猜测,因为这确实像一个线程一样,仍然有可能需要的同步对象这是正确的吗?
技术上,是的。有些时候你可能需要使用这些,但很大程度上,没有。 理想情况,如果您正在使用惯用法,您可以避免这种情况,至少在大多数情况下如此。通常,当一个任务依赖于在其他任务中运行的代码时,它应该是该任务的延续,并且通过任务来评估任务之间的信息。 Result
财产。使用Result
并不需要任何同步机制,因此通常 可以完全避免它们。
我看到整个新的mvc 5项目的任务,我想知道为什么会发生这种情况?
当你要制作异步时,通常有必要使所有异步(或没有)。混合和匹配只是......不起作用。异步代码依赖让每个方法都花费很少的时间来执行,以便消息泵可以返回处理其待处理任务/继续的队列。混合异步代码和同步代码使得它很可能会使应用程序死锁,并且还会破坏使用异步的大多数目的(这是为了避免阻塞线程)。