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

Wil*_*iam 18 c# parallel-processing multithreading task task-parallel-library

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

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

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

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

svi*_*ick 25

使用Tasks 有两个主要优点:

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

使用时还有一些较小的优点Task:

  1. 您可以使用自定义TaskScheduler来决定Task运行的时间和位置.例如,如果要在UI线程上运行aTask, 限制并行度具有Task级别的reader-writer锁定,这可能很有用.
  2. Task通过支持合作取消CancellationToken.
  3. Task表示计算的s有一些性能改进.例如,它们使用工作窃取队列来进行更有效的处理,并且它们还支持内联(Task在同步等待它的线程上执行尚未启动的内联).

  • +1,优秀的答案.但是,我认为"较小的#1"是主要优势,并将"自定义"替换为"特定".有两个常用的内置TaskScheduler,一个用于可在任何ThreadPool线程上运行的后台任务,另一个用于必须在特定SynchronizationContext中运行的代码,例如在UI线程上.要点2:您无需为此功能编写自定义调度程序即可.要点1:同样的模型可以用于未来工作的前景和背景单元,这是一个巨大的好处. (2认同)