首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何中止CCR线程\任务?

如何中止CCR线程\任务?
EN

Stack Overflow用户
提问于 2009-07-13 16:13:30
回答 2查看 481关注 0票数 1

我想在使用CCR的项目中实现任务执行的超时。基本上,当我将一个项目发送到一个端口或者将一个任务排入队列到一个DispatcherQueue时,我希望能够中止任务或正在运行的线程,如果它花费的时间超过了配置的时间。我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-18 22:46:25

你能确认你问的是什么吗?您是否正在Dispatcher中运行长期任务?终止线程将破坏CCR模型,因此您需要能够向线程发出信号以完成其工作并让步。假设它是一个不够快结束的循环,你可能会选择将一个计时器排入队列:

代码语言:javascript
复制
var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
                             resultTimeoutPort);

并确保阻塞线程具有对resultTimeoutPort的引用。在阻塞循环中,退出条件之一可能是:

代码语言:javascript
复制
do
{
    //foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
       someOtherCondition)

如果我找错人了,请贴出更多信息。

票数 2
EN

Stack Overflow用户

发布于 2009-10-06 14:32:21

您可以在CCR“接收”处理程序的开头(或在通过委托调用您的方法的方法中)注册线程(Thread.CurrentThread)。然后,您可以执行定期检查,并在必要时中止,基本上与手动创建线程的方式相同。问题是,如果您将自己的Microsoft.Ccr.Core.Dispatcher与固定数量的线程一起使用,我认为一旦中止这些线程,就没有办法找回它们(基于我的测试)。因此,如果您的dispatcher有5个线程,那么您将只能中止5次,然后work将不再工作,无论注册了什么任务。但是,如果您使用CLR线程池构造DispatcherQueue,则中止的任何CCR线程都将自动替换,您不会遇到该问题。据我所见,虽然建议使用CCR dispatcher,但我认为在这种情况下使用CLR线程池是可行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1120453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档