任务并行库-长时间运行任务与多个连续任务

本文关键字:任务 连续 长时间 并行 运行 | 更新日期: 2023-09-27 18:21:48

我正在研究任务并行库在我正在做的一个工作项目中的使用情况,并希望了解长时间运行任务的优点/缺点。我还没有一个现实生活中的例子,只是想了解这背后的理论。

从MSDN页面上关于任务调度器和这个SO问题的描述来看,似乎最好尽可能避免长时间运行的任务,这样就不会在ThreadPool之外创建线程。但假设你确实有一项需要很长时间才能完成的任务,而不是这个:

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning)

你能试着把你的工作分成更小、更快的工作单元并使用任务延续吗,比如这样:

Task.Factory
    .StartNew(() => DoWorkPart1())
    .ContinueWith(t => DoWorkPart2())
    .ContinueWith(t => DoWorkPart3())
    //...etc

这种方法会更有益吗?还是对它试图实现的目标来说过于夸张了?

任务并行库-长时间运行任务与多个连续任务

似乎最好尽可能避免长时间运行的任务

不完全正确。如果你需要它,那么你必须以某种方式创建/分配一个线程,然后"任务长运行"选项可能是最好的选择。该标志只是通知调度程序任务可能需要一段时间,以便调度程序能够预测。它甚至可能忽略这个选项。

你能试着把你的工作分成更小、更快的单位吗?

如果可以的话,那就去做吧。但不是所有的塔克都那么容易分开。

当您主要指定TaskCreationOptions.LongRunning时,它会从线程池外部分配一个专用线程。

我建议您只需使用BackgroundWorker类,它可以确保您的长期运行任务将在单独的专用线程上运行,而不是在线程池中的线程上运行