如何中止.net任务
本文关键字:任务 net 何中止 | 更新日期: 2023-09-27 18:05:36
情况是这样的,我正在为一场代码大战竞赛编写框架。当代码运行时,对于每一个回合,它调用每个参赛者提供的库中的一个方法。比赛规则是方法必须在1秒内返回,否则我们将终止调用它们的任务。然后我们使用一个默认的结果。
方法不支持取消,因为我们不能相信被调用的代码会响应取消。我们需要杀死线程,因为如果我们有10或20个被忽略的后台任务,那么所有的调用将在每次调用上提供更少的时钟周期,而之前花费不到1秒的方法现在需要更多的时间。
从好的方面来说,我们正在终止的方法应该没有打开的资源,等等,所以abort应该不会留下任何挂起的东西。
Update:这里需要记住两件事。首先,这就像一场游戏,所以表现很重要。其次,工作线程不太可能有任何打开的资源。如果其中一个被调用的方法运行时间过长,我需要中止它并迅速继续。
您应该以较低的权限在每个参赛者自己的AppDomain中运行。这有几个优点:
- 这是沙箱
- 它不能与进程中的任何其他代码交互
- 强制卸载AppDomain比较干净。
即使您更喜欢杀死线程而不是卸载AppDomain,我仍然会将每个竞争者放入AppDomain以获得隔离。
不幸的是,Thread.Abort
是不够的。它仍然执行finally
子句,可以想用多长时间就用多长时间。
我建议您在第二个进程中运行代码,并仔细定义与它通信的接口,以确保它可以处理未接收到响应。大多数操作系统都被设计成在终止进程后进行很好的清理。
对于通信,您可能应该避免. net远程,因为这可能会在服务器端留下不一致的状态。其他选择:套接字、命名管道、web服务。Thread.Interrupt()方法可能是你正在寻找的。
正如MSDN文档所说,"如果这个线程当前没有在等待、睡眠或加入状态下被阻塞,它将在下一次开始阻塞时被中断。"
它不是一个中止,它强制运行的线程在线程进入等待状态时抛出ThreadInterruptedException。
你可以在另一个线程中使用计时器来检查线程是否真的不想终止,如果线程拒绝终止,例如,30秒,你可以中止它