我想在使用CCR的项目中执行任务的超时。基本上,当我将项目发布到端口或将任务排入DispatcherQueue时,我希望能够中止任务或其运行的线程,如果它花费的时间超过一些配置的时间。我怎么能这样做?
答案 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线程池是这种情况下的方法。