【问题标题】:How to stop executing all tasks for 3 minutes and then continue executing code如何停止执行所有任务 3 分钟然后继续执行代码
【发布时间】:2012-07-23 18:20:01
【问题描述】:

我有正在运行 Work 方法的任务

private void Work(Crawler crawler, PropertyBag propertyBag) {}

现在我想停止所有任务 3 分钟,然后继续执行。我试试

Thread.Sleep 但不工作。任务仍在工作。什么是停止任务 3 分钟然后继续的好解决方案。也许锁定以及如何做到这一点?

【问题讨论】:

    标签: c# multithreading task


    【解决方案1】:

    Thread.Sleep 不起作用,因为它使当前线程休眠。

    如果您手动创建线程,而不是使用 TPL,那么您希望有一个线程列表/数组。您可以使用 Thread.Suspend 和 Thread.Resume 方法。

    foreach (var t in threads) t.Suspend();
    
    // Then in 3 minutes.
    foreach (var t in threads) t.Resume();
    

    请注意,睡眠/恢复已过时!

    编辑

    如果没有线程列表,那么您可以使用ManualResetEvent。在您的 Work 方法中,在尝试任何工作之前对其进行.WaitOne()

    当你想休眠任务时在你的主线程上调用.Reset,然后在3分钟内调用.Set

    【讨论】:

    • 如果一切都在工作方法中怎么办。我可以在同一方法中使用 ManualResetEvent 和 .Reset 吗?
    • 因为我做了:ManualResetEvent mre = new ManualResetEvent(false);然后 mre.WaitOne();和 mre.Reset();线程.睡眠(3 * 60 * 1000); mre.Set();但应用程序仍在执行代码。任务仍在进行中...
    • mre.WaitOne() 应该在您的任务中。
    • @AgentFire 是正确的。 mre 应该是所有任务的成员,而不是按类创建,或者是工作人员可以访问的某个类的静态成员。
    • 很高兴能提供帮助。也许你可以发布你的最终代码来帮助别人。
    【解决方案2】:

    无法随意自动暂停和恢复任务。但是,您可以在您可能希望暂停的代码中放置特殊的“观察者”,例如 ManualResetEvent.WaitOne() 语句,并随时从其他线程重置它们。

    【讨论】:

    • 这就是我会做的,是的。
    最近更新 更多