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

Parallel processing 任务并行库线程中止/中断,parallel-processing,task,Parallel Processing,Task,考虑一个在应用程序中使用表的大型应用程序 用于计划作业的sql server数据库 表中的每一行都标记有queueID、methodName和其他元数据。 methodName可以是本机的点网接口、传统的com本地接口, 第三方web服务的第三方com接口或URI 目前有一系列32位后台exe处理每个队列ID。 由queueID设置的每个作业可以运行的时间有一个设置的最大时间限制,看门狗将 如果超过时间限制,请终止进程 我们希望将其移动到64位环境并整合多个后台exe进程 进入单个多线程wind

考虑一个在应用程序中使用表的大型应用程序 用于计划作业的sql server数据库 表中的每一行都标记有queueID、methodName和其他元数据。 methodName可以是本机的点网接口、传统的com本地接口, 第三方web服务的第三方com接口或URI

目前有一系列32位后台exe处理每个队列ID。 由queueID设置的每个作业可以运行的时间有一个设置的最大时间限制,看门狗将 如果超过时间限制,请终止进程

我们希望将其移动到64位环境并整合多个后台exe进程 进入单个多线程windows服务

问题是我们如何处理超过设定时间限制的作业终止。 如果我们从单个appDomain主线程为任务并行库中的每个queueID分配一个任务 显然,不能使用net4.0取消令牌,因为线程可能运行com接口或 第三方web服务。如果appDomain看门狗任务调用Thread.abort(),它可能会损坏整个appDomain并拆除所有任务线程。我不清楚Thread.Interrupt()是否会可靠地取消线程而不会损坏appDomain

那么,建议使用什么技术来杀死超过时间限制的线程呢

我们是否让服务为每个queueID创建一个AppDomain,然后执行 myAppDomain1.ExecuteAssembly(“queueProcess.exe arg1”) myAppDomain2.ExecuteAssembly(“queueProcess.exe arg2”) ... 几乎与现在存在的拱门相同,但它是一个控制appDomains的win服务 然后使用tpl线程池在每个queueProcess.exe中的一组较小的池中运行作业&看门狗只执行AppDomain?卸载
当进程超过其时间限制时,不能调用任意本机代码并使其完全关闭。如果您杀死它的线程(如果您使用CreateThread启动该线程,这是可能的),您通常会泄漏内存、损坏数据、不释放锁、保持文件句柄打开等等。没有合作,这是行不通的。进程是处理这一问题的正确方法,因为它们可以在任何时候被干净地终止

对于仅托管任务,卸载appdomain是安全的(ASP.NET就是这样做的)。不要因为线程可能使全局结构处于不一致的状态而中止线程。或者您可能会中止一个使整个类永远不可用的静态构造函数(静态构造函数是不可重启的)


您可以有一个通用主机进程,它通过命名管道接收输入并运行您的任务。这样的过程可以很轻。您可以随时杀死它。

您不能调用任意本机代码并使其完全关闭。如果您杀死它的线程(如果您使用CreateThread启动该线程,这是可能的),您通常会泄漏内存、损坏数据、不释放锁、保持文件句柄打开等等。没有合作,这是行不通的。进程是处理这一问题的正确方法,因为它们可以在任何时候被干净地终止

对于仅托管任务,卸载appdomain是安全的(ASP.NET就是这样做的)。不要因为线程可能使全局结构处于不一致的状态而中止线程。或者您可能会中止一个使整个类永远不可用的静态构造函数(静态构造函数是不可重启的)


您可以有一个通用主机进程,它通过命名管道接收输入并运行您的任务。这样的过程可以很轻。您可以随时杀死它。

hmm>对于仅管理的任务,卸载appdomain是安全的。<您确定“仅管理”任务是因为asp net可以通过com接口运行非仅管理的代码,并且似乎可以杀死它?如果您现在中止com代码中的线程,一开始不会发生任何事情。中止将在调用返回时发生。如果调用托管代码知道使用finally块处理所有本机资源,那么这是安全的。在某种意义上,这需要被中止的托管代码的合作。ASP.NET实际上在这里冒了一些风险。你能审核你的代码以确保本机资源被正确释放吗?如果是,您可以安全地执行此操作。hmm>对于仅管理的任务,您可以安全地卸载appdomain<您确定“仅管理”任务,因为asp net可以通过com接口运行非仅管理的代码,并且似乎可以终止此任务?如果您中止com代码中的线程,首先不会发生任何事情。中止将在调用返回时发生。如果调用托管代码知道使用finally块处理所有本机资源,那么这是安全的。在某种意义上,这需要被中止的托管代码的合作。ASP.NET实际上在这里冒了一些风险。你能审核你的代码以确保本机资源被正确释放吗?如果是,您可以安全地执行此操作。