任务并行库 - 长时间运行任务 vs 多个继续操作

11
我正在研究任务并行库的使用,这是我正在做的一个工作项目,我想了解长时间运行任务的优缺点。我还没有真实的例子,只是想了解其背后的理论。
从MSDN页面关于任务调度程序和这个SO问题所说的来看,似乎最好尽可能避免长时间运行的任务,这样就不会在线程池外创建线程。但是,假设你确实有一个需要很长时间才能完成的任务,那么可以考虑以下方式:
Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning)

你能否尝试将工作分解成更小、更快的工作单元,并使用任务继续,就像这样:

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

这种方法是否更有益,还是为了达到目的而过度了呢?

这真的取决于你所说的“长”是什么意思。 - user703016
2个回答

6

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

并不完全正确。如果需要,您必须以某种方式创建/分配线程,然后带有LongRunning选项的任务可能是最佳选择。该标志仅通知调度程序任务可能需要一段时间,以便调度程序可以预期。它甚至可能忽略该选项。

您能否尝试将工作拆分为更小,更快的工作单元

如果可以,那就这样做。但并非所有任务都如此容易分离。


我认为并不是所有的算法都能很容易地分解成更小的块。但如果可以的话,这样做会更好吗? 我猜这将比调度程序创建另一个线程更好地利用TPL,我对吗? - Peter Monks
可能会更好,但这并不确定。我通常不会太在意。你不知道(也无法知道)它是否会导致额外的线程。 - H H

4
当您指定TaskCreationOptions.LongRunning时,它通常会分配一个来自线程池之外的专用线程。
我建议直接使用BackgroundWorker类,它可以确保您的长时间运行任务在一个单独的专用线程上运行,而不是从线程池中获取线程。

1
TaskCreationOptions.LongRunning 通常也会创建一个专用线程。 - dtb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接