c# - System.Threading.Task 什么时候有用?

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

我已经广泛使用了大部分 Threading 库。我非常熟悉创建新线程、创建 BackgroundWorkers 和使用内置的 .NET ThreadPool(它们都非常酷)。

但是,我从来没有找到使用 Task 的理由类(class)。我可能见过一两个人们使用它们的例子,但是这些例子不是很清楚,而且它们没有给出一个高层次的概述,说明为什么应该使用任务而不是新线程。

问题 1:从高层次上看,与 .NET 中的其他并行性方法相比,什么时候使用任务有用?

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

最佳答案

使用 Task 有两个主要优点:

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

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

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

关于c# - System.Threading.Task 什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11596753/

相关文章:

c# - 清除 XmlTextWriter 和 StringWriter 中的所有内容

c# - SRI 散列不是预期的

c# - 加里奥.Model.ModelException : An exception occurred while invoking a test driver

c++ - moveToThread 与从 Qt 中的 QThread 派生

带有进度指示器的 JavaFX 线程不旋转,在非 FXThread 中完成的工作

c - 如何在 OpenMP 中的线程之间分发数据?

CUDA:如何使该代码并行?

parallel-processing - Spark Direct Stream 不会为每个 kafka 分区创建并行流

c# - SocketIoClientDotNet - Socket.IO 客户端库有时会发出两个连续的事件,有时不会

python - 我应该总是使用 threading.Thread.join()