【问题标题】:Task Parallel Library - LongRunning task vs Multiple Continuations任务并行库 - LongRunning 任务与多个继续
【发布时间】:2012-02-22 05:24:28
【问题描述】:

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

从 MSDN 页面关于 task schedulersSO question 的内容来看,似乎最好尽可能避免长时间运行的任务,这样您就不会在 ThreadPool 之外创建线程。但是假设你确实有一个需要很长时间才能完成的任务,而不是这个:

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

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

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

这种方法是否会更有益,还是对于它试图实现的目标来说是矫枉过正?

【问题讨论】:

  • 这真的取决于你所说的long是什么意思。

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


【解决方案1】:

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

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

【讨论】:

  • TaskCreationOptions.LongRunning 通常也会导致创建一个专用线程。
【解决方案2】:

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

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

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

如果可以,那就去做吧。但并非所有事物都那么容易分离。

【讨论】:

  • 我同意并非所有算法都可以很容易地拆分成更小的块。但是如果可以的话,这样做会更好吗?我猜它会比创建另一个线程的调度程序更好地利用 TPL,对吗?
  • 可能会更好,但这并不确定。我通常不会打扰太多。你不(不能)知道它是否会导致额外的线程。
猜你喜欢
  • 2013-02-13
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多