任务并行库线程中止/中断

时间:2012-04-05 20:42:40

标签: parallel-processing task

考虑使用a中的表的大型应用程序 用于调度作业的SQL Server数据库 表中的每一行都标有queueID,methodName和其他元数据。 methodName可以是本机点网接口,传统com本地接口, 第三方com接口或第三方Web服务的URI。

目前有一个32位后台exe的系列处理每个queueID。 监视器会对queueID设置的每个作业运行的时间设置一个最大时间限制 如果超过时限,则终止进程。

我们希望将其移至64位环境&合并多个后台exe进程 进入单个多线程Windows服务。

问题是我们如何处理超过设定时限的作业。 如果我们从单个appDomain主线程的任务并行库为每个queueID分配一个任务 很明显,net4.0取消令牌无法使用,因为该线程可能运行com接口或 第三方Web服务。如果appDomain监视程序任务调用Thread.abort(),它可能会破坏整个appDomain&拆除所有任务线程我不清楚Thread.Interrupt()是否可靠地取消没有appDomain损坏的线程。

那么杀死超过时间限制的线程的建议技术是什么?

OR

我们是否让服务为每个queueID创建一个AppDomain然后执行 myAppDomain1.ExecuteAssembly(“queueProcess.exe arg1”) myAppDomain2.ExecuteAssembly(“queueProcess.exe arg2”) ... 几乎相同的拱门现在存在,但它是一个控制appDomains的胜利服务 和每个queueProcess.exe&然后使用tpl线程池在每个queueProcess.exe&中的一组较小的池中运行作业。看门狗只做AppDomain?。卸载 当一个过程超过了它的时间限制

1 个答案:

答案 0 :(得分:1)

您不能调用任意本机代码并导致它干净地关闭。如果你杀了它的线程(如果你使用CreateThread启动了那个线程就可以),你通常会泄漏内存,损坏数据,不释放锁,保持文件句柄打开等等。没有合作,这是行不通的。进程是处理此问题的正确方法,因为它们可以随时被彻底清除。

对于托管专用任务,您可以安全地卸载appdomain(ASP.NET就是这样做的)。不要只是中止线程,因为它可能使全局结构处于不一致状态。或者你可能会中止一个静态的ctor,它会使整个类永远无法使用(静态ctors不能重启)。

您可以拥有一个通用主机进程,该进程将其输入通过命名管道并运行您的任务。这样的过程可以是轻量的。你可以随时杀死它。