我已经广泛使用了大部分 Threading 库。我非常熟悉创建新线程、创建 BackgroundWorker 和使用内置的 .NET ThreadPool(这些都非常酷)。
但是,我从未找到使用Task类的理由。我可能看到过一两个使用它们的例子,但是这些例子不是很清楚,也没有给出一个高级概述,说明为什么应该使用任务而不是新线程。
问题 1:从高层次上看,在 .NET 中使用任务与其他方法之一相比何时有用?
问题 2:有没有人有一个简单和/或中等难度的例子来演示如何使用任务?
我已经广泛使用了大部分 Threading 库。我非常熟悉创建新线程、创建 BackgroundWorker 和使用内置的 .NET ThreadPool(这些都非常酷)。
但是,我从未找到使用Task类的理由。我可能看到过一两个使用它们的例子,但是这些例子不是很清楚,也没有给出一个高级概述,说明为什么应该使用任务而不是新线程。
问题 1:从高层次上看,在 .NET 中使用任务与其他方法之一相比何时有用?
问题 2:有没有人有一个简单和/或中等难度的例子来演示如何使用任务?
Task
使用s有两个主要优点:
Task
可以表示将来可用的任何结果(一般概念并不特定于.Net,它被称为future),而不仅仅是计算。这对于async
-尤其重要await
,它使用Task
s 进行异步操作。由于获得结果的操作可能会失败,因此Task
s 也可以表示失败。Task
有很多方法可以对它们进行操作。您可以同步等待它完成(Wait()
),等待它的结果(Result
),在完成时设置一些操作Task
(ContinueWith()
)以及一些在多个Task
s 上工作的方法(WaitAll()
, WaitAny()
, ContinueWhenAll()
)。所有这些都可以使用其他并行处理方法实现,但您必须手动完成。使用还有一些较小的优势Task
:
TaskScheduler
来决定Task
运行的时间和地点。例如,如果您想在 UI 线程上运行 aTask
、 限制并行度或拥有一个Task
级别的 reader-writer 锁,这可能很有用。Task
支持通过合作取消CancellationToken
。Task
表示计算的 s 有一些性能改进。例如,它们使用工作窃取队列来进行更有效的处理,并且它们还支持内联(Task
在同步等待它的线程上执行尚未开始的线程)。