如何中止CCR线程\任务?

时间:2009-07-13 16:13:30

标签: c# port ccr

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

2 个答案:

答案 0 :(得分:2)

你能确认一下你的要求吗?你在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)

如果我正在咆哮错误的树,请发布更多信息。

答案 1 :(得分:0)

您可以在CCR“Receive”处理程序的开头(或通过委托调用方法的方法)中注册线程(Thread.CurrentThread)。然后,您可以进行定期检查并在必要时中止,基本上与手动创建线程时相同。问题是,如果您使用自己的Microsoft.Ccr.Core.Dispatcher具有固定数量的线程,我认为有一种方法可以在您中止这些线程后取回这些线程(基于我的测试)。因此,如果您的调度员有5个线程,那么无论注册了什么任务,您都只能在发布之前中止5次,然后才能继续工作。但是,如果使用CLR线程池构造DispatcherQueue,则中止的任何CCR线程都将自动替换,您将不会遇到此问题。从我所看到的情况来看,虽然推荐使用CCR调度程序,但我认为使用CLR线程池是这种情况下的方法。