【问题标题】:Start, Stop, Pause and Continue a very long running method开始、停止、暂停和继续一个很长的运行方法
【发布时间】:2011-03-31 21:17:12
【问题描述】:

我有一个运行时间很长的方法。我希望能够停止、暂停并继续执行该方法。我查看了this question,答案很好,但我想使用更通用的库,如 TPL。 TPL 有取消机制,但我找不到暂停/继续功能。

编辑

感谢所有回答。但问题是我没有写那个“长时间运行”的方法,我只是调用那个方法。

【问题讨论】:

  • 为什么你需要能够阻止它?你想解决什么问题?
  • 用户必须能够按下按钮才能停止执行该操作。
  • 您链接到的解决方案是我将如何处理它(并且包装得很好)。它可以很容易地被 TPL 使用。为什么不使用它?

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


【解决方案1】:

实现这一点的最简单方法是使用 BackgroundWorker 控件。它支持取消和进度报告。

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/48305e65-cea6-4a88-8818-c122e152daa8

编辑

哦,我明白了。好吧,除非您想暂停线程,否则没有“干净”的方法可以暂停和恢复您未编写的方法。而且,如果该方法不是线程安全的,那么您可能会不走运。 http://msdn.microsoft.com/en-us/library/d00bd51t.aspx

【讨论】:

  • 是否可以暂停/恢复 BackgroundWorker ?
  • 是的,请查看第二个链接。本质上,您将Paused 属性添加到BackgroundWorker(通过创建一个新类并从它继承)。然后,在您的 DoWork 事件中,您可以在任何可能暂停的地方添加手动 while (Paused) Thread.Sleep(10); 呼叫。
  • @SimpleCoder:我认为你的 wiki 标记和降价混淆了。您能否编辑您的帖子以提高可读性?
  • 你真的不需要睡觉见this
  • @sehe:对不起,我没明白你的意思。哪部分搞砸了?
【解决方案2】:

我想你已经回答了你自己的问题。如果您需要暂停/继续功能,则需要设置一些协议。作为您使用重置事件引用的question 的答案是要走的路。

如果您只需要按照您所说的执行 Cancel 操作,Task Parallel Library (TPL) 就有 CancelationToken。

【讨论】:

    【解决方案3】:

    如果它很长并且需要持久化,您可能需要查看 Windows Workflow Foundation。

    【讨论】:

    • 感谢您的回答,但这不是那种“长时间运行”,它只是做很长的计算。
    • 暂停功能触发我提供此选项。当暂停很长一段时间(谁知道多长时间......)时,保持进程的状态可能非常困难。一个简单的工作流程可以为您做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多