任务并行库 - LongRunning任务与多个Continuations

时间:2012-01-30 11:56:37

标签: c# .net .net-4.0 task-parallel-library

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

从MSDN网页上对task schedulersSO question所说的话,似乎最好尽可能避免长时间运行的任务,这样你就不会在ThreadPool。但是说你确实有一项任务需要很长时间才能完成,而不是:

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

您是否可以尝试将您的工作分成更小,更快的工作单元并使用任务延续,如下所示:

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

这种方法是否会更有益,或者它试图实现的目标是否过度?

2 个答案:

答案 0 :(得分:6)

  

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

不完全正确。如果你需要它,那么你将不得不以某种方式制作/分配一个线程,然后使用LongRunning选项的任务可能是最好的选择。该标志只是通知调度程序,Task可能需要一段时间,以便调度程序可以预期。它甚至可能会忽略该选项。

  

你能否尝试将你的工作分成更小,更快的工作单元

如果可以,那就去做吧。但是,并非如此容易分开。

答案 1 :(得分:4)

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

我建议只使用BackgroundWorker类,它确保您的长时间运行任务将在一个单独的专用线程上运行,而不是来自线程池的线程