【问题标题】:Running multiple long-running tasks as a transaction in TPL C#在 TPL C# 中将多个长时间运行的任务作为事务运行
【发布时间】:2011-09-12 11:01:02
【问题描述】:

我有一个包含 n 个任务的列表,我想并行、异步地执行。

每个并行运行的任务可以有 1 个或多个嵌套任务。

我还需要等待和分析每个Task的返回结果。 只有所有任务都成功执行(例如,它们返回“true”),整个操作才成功。

实际上,这是一个事务操作,我需要等待许多任务成功完成。

问题是每项任务可能需要 1-3 小时才能完成(有些任务可能只需要几分钟,而有些则需要几个小时) 整个操作可能需要一个完整的工作日。

我的问题:

  1. 这种方法使用任务并行库是否可行且可行?
  2. 还有,什么 如果其中一项任务超时并且未能向 妈妈的任务?
  3. 库能否处理任务不存在的情况? 只是嵌套,但是 alos 需要很长时间才能完成?

编辑: 我发现 this blog post 关于取消任务,尤其是长时间运行的任务。 也许它对其他人也有用。

【问题讨论】:

  • 这里会涉及到 SQL 事务(或任何远程事务)吗?

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


【解决方案1】:

你在找Task.WaitAll吗?

如果任务实际上超时 - 即故障 - 然后将抛出 AggregateException。请注意,WaitAll 将等待所有任务以一种或其他方式完成后再返回,即使某些任务提前失败。

我没有理由相信 TPL 对需要很长时间的任务有任何问题。

【讨论】:

  • 是和不是。我不是在寻找 TPL 功能本身;我在问任务(大多数嵌套任务)如何可靠地向其父任务报告,以及您可能遇到什么问题。例如,当一项任务被取消或超时时,其他任务(嵌套与否)是否仍会运行到完成(即使它不是必需的,因为其中一个已经失败)?
  • @John:在这种情况下,他们会继续运行,因为您使用的是WaitAll。您可以改用WaitAny,然后让调用者注意到失败并使用正常的TPL 取消机制来取消其他任务。我不知道是否有内置的“如果其中任何一个失败则取消所有这些”方法。使用WaitAny,您需要保持一组不断减少的“仍在进行中”的任务,并且只有在所有任务都成功后才能真正完成,顺便说一句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2015-07-06
  • 1970-01-01
  • 2012-08-13
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多