我想在使用CCR的项目中实现任务执行的超时。基本上,当我将一个项目发送到一个端口或者将一个任务排入队列到一个DispatcherQueue时,我希望能够中止任务或正在运行的线程,如果它花费的时间超过了配置的时间。我该怎么做呢?
发布于 2009-07-18 22:46:25
你能确认你问的是什么吗?您是否正在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)如果我找错人了,请贴出更多信息。
发布于 2009-10-06 14:32:21
您可以在CCR“接收”处理程序的开头(或在通过委托调用您的方法的方法中)注册线程(Thread.CurrentThread)。然后,您可以执行定期检查,并在必要时中止,基本上与手动创建线程的方式相同。问题是,如果您将自己的Microsoft.Ccr.Core.Dispatcher与固定数量的线程一起使用,我认为一旦中止这些线程,就没有办法找回它们(基于我的测试)。因此,如果您的dispatcher有5个线程,那么您将只能中止5次,然后work将不再工作,无论注册了什么任务。但是,如果您使用CLR线程池构造DispatcherQueue,则中止的任何CCR线程都将自动替换,您不会遇到该问题。据我所见,虽然建议使用CCR dispatcher,但我认为在这种情况下使用CLR线程池是可行的。
https://stackoverflow.com/questions/1120453
复制相似问题