我想在使用 CCR 的项目中实现任务执行超时。基本上,当我将项目发布到端口或将任务排入 DispatcherQueue 时,我希望能够中止任务或其运行的线程,如果它花费的时间超过某个配置的时间。我怎样才能做到这一点?
问问题
481 次
2 回答
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)
如果我在吠叫错误的树,请发布更多信息。
于 2009-07-18T22:46:25.367 回答
0
您可以在 CCR“接收”处理程序的开头(或在通过委托调用您的方法的方法中)注册线程 (Thread.CurrentThread)。然后,您可以进行定期检查并在必要时中止,基本上与手动创建线程时所做的相同。问题是,如果您将自己的 Microsoft.Ccr.Core.Dispatcher 与固定数量的线程一起使用,我认为一旦中止它们(基于我的测试),就没有办法让这些线程恢复原状。因此,如果您的调度程序有 5 个线程,则无论已注册哪些任务,您都只能中止 5 次,然后发布将不再工作。但是,如果您使用 CLR 线程池构造 DispatcherQueue,则您中止的任何 CCR 线程都将被自动替换,您将不会遇到这个问题。从我的
于 2009-10-06T14:32:21.100 回答