System.Threading.Task什么时候有用?

时间:2012-07-22 00:00:50

标签: c# multithreading parallel-processing task-parallel-library task

我广泛使用了大部分线程库。我非常熟悉创建新的Threads,创建BackgroundWorkers和使用内置的.NET ThreadPool(这些都非常酷)。

但是,我从未找到使用Task课程的理由。我看过可能有一两个人使用它们的例子,但是这些例子不是很清楚,并且没有给出为什么人们应该使用任务而不是新线程的高级概述。

问题1:从高级别开始,什么时候使用一个有用的任务而不是其他.NET并行方法?

问题2:有没有人有一个简单和/或中等难度的例子来演示如何使用任务?

1 个答案:

答案 0 :(得分:25)

使用Task s有两个主要优点:

  1. Task可以表示将来可用的任何结果(一般概念不是特定于.Net,它称为future),而不仅仅是计算。这对async - await尤为重要,它使用Task进行异步操作。由于获得结果的操作可能会失败,Task也可能表示失败。
  2. Task有很多方法可以对它们进行操作。您可以同步等待它完成(Wait()),等待其结果(Result),在Task完成时设置一些操作(ContinueWith())以及一些方法这适用于多个TaskWaitAll()WaitAny()ContinueWhenAll())。所有这些都可以使用其他并行处理方法,但您必须手动完成。
  3. 使用Task还有一些小优势:

    1. 您可以使用自定义TaskScheduler来确定Task的运行时间和地点。这可能很有用,例如,如果您想要run a Task on the UI threadlimit the degree of parallelismhave a Task-level readers–writer lock
    2. Task通过CancellationToken支持合作取消。
    3. 代表计算的
    4. Task有一些性能改进。例如,他们使用工作窃取队列来进行更有效的处理,并且它们还支持内联(在同步等待它的线程上执行尚未启动的Task)。