2009-07-13 60 views
1

我想在使用CCR的项目中执行任务的超时。基本上,当我将一个项目发布到端口或将任务排入DispatcherQueue时,我希望能够中止该任务或其运行的线程,如果这需要比配置的时间更长的时间。我怎样才能做到这一点?如何中止CCR线程任务?

+0

很酷。机器人问题。 – Will 2009-07-13 16:38:28

回答

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) 

如果我吠叫错误的树,请发布更多信息。

+0

除了我试图避免对foomungus工作代码进行更改之外,您正朝着正确的方向前进。此外,该代码可能并不总是有循环,有时我只是希望它在时间t尝试并完成,如果不能,就离开。我一直在做一些阅读,看起来可能没有办法获得我想要的确切行为,因为我会按照你所说的打破模型。 – SpaceghostAli 2009-07-20 13:57:14

0

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