【问题标题】:How do I abort CCR threads\tasks?如何中止 CCR 线程\任务?
【发布时间】:2010-11-10 08:45:18
【问题描述】:

我想在使用 CCR 的项目中实现任务执行超时。基本上,当我将项目发布到端口或将任务排入 DispatcherQueue 时,我希望能够中止任务或其运行的线程,如果它花费的时间超过配置的时间。我该怎么做?

【问题讨论】:

    标签: c# port ccr


    【解决方案1】:

    你能确认你在问什么吗?您是否在 Dispatcher 中运行长期任务?杀死线程会破坏 CCR 模型,因此您需要能够向线程发出信号以完成其工作并屈服。假设它是一个没有足够快完成的循环,您可能会选择将计时器排入队列:

    var resultTimeoutPort = new Port<DateTime>();
    dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
                                 resultTimeoutPort);
    

    并确保阻塞线程具有对 resultTimeoutPort 的引用。在阻塞循环中,退出条件之一可能是:

    do
    {
        //foomungus amount of work
    }while(resultTimeoutPort.Test()==null&&
           someOtherCondition)
    

    如果我找错树了,请发布更多信息。

    【讨论】:

    • 您正朝着正确的方向前进,只是我试图避免更改 foomungus 工作代码。此外,该代码可能并不总是有一个循环,有时我只是希望它在时间 t 内尝试完成,如果不能,就离开。我一直在做一些阅读,看起来可能没有办法获得我想要的确切行为,因为我会像你所说的那样破坏模型。
    • 确实,在没有杀死线程的情况下,我认为您只能向它发出信号以快速退出。你想达到什么目的?也许有不同的方法来解决这个问题?
    【解决方案2】:

    您可以在 CCR“接收”处理程序的开头(或在通过委托调用您的方法的方法中)注册线程 (Thread.CurrentThread)。然后,您可以进行定期检查并在必要时中止,基本上与手动创建线程时所做的相同。问题是,如果您将自己的 Microsoft.Ccr.Core.Dispatcher 与固定数量的线程一起使用,我认为一旦中止它们(基于我的测试),就没有办法让这些线程恢复原状。因此,如果您的调度程序有 5 个线程,则无论已注册哪些任务,您都只能中止 5 次,然后发布将不再工作。但是,如果您使用 CLR 线程池构造 DispatcherQueue,则您中止的任何 CCR 线程都将被自动替换,您将不会遇到这个问题。从我所见,虽然建议使用 CCR 调度程序,但我认为在这种情况下使用 CLR 线程池是可行的方法。

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2014-05-04
      • 2012-08-06
      相关资源
      最近更新 更多