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

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

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

根据 MSDN 页面关于 task schedulers 的说法还有这个SO question ,似乎最好尽可能避免长时间运行的任务,这样您就不会在 ThreadPool 之外创建线程。但是假设您确实有一项需要很长时间才能完成的任务,而不是这样:

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

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

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

这种方法是否会更有用,或者对于它试图实现的目标来说是否过大?

最佳答案

it would seem as though it is best to avoid long-running tasks as much as possible

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

Could you try and split up your work into smaller, quicker units of work a

如果可以,那就去做吧。但并不是所有的人都这么容易分开。

关于c# - 任务并行库 - LongRunning 任务与多个 Continuations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9063502/

相关文章:

.net - 无法在装有 VS2010/.net4 的电脑上运行基于 .net3.5 的 exe?

c# - 连续打字时不要引发 TextChanged

c# - 如何将字符串解析为时间跨度

c# - 字符串未被识别为 Sql 服务器的有效 DateTime C#

c# - 如何以最优雅的方式将数据绑定(bind)到 ItemsControl 中的特定项目属性?

c# - 在 .NET 中移动不同卷上的文件

c# - Ajax JQuery 将数据传递给 POST 方法

c# - 使用 selenium 读取浏览器日志时出现 System.NullReferenceException

.net - 在本地运行 Azure 模拟器以进行生产

asp.net - UrlRewriter.NET 与 .NET 4.0 无法正常工作