如何中止.NET任务?

时间:2011-08-13 20:21:43

标签: c# .net task task-parallel-library abort

情况就是这样,我正在编写代码战争竞赛的框架。当代码运行时,对于每个回合,它调用每个参赛者提供的库中的方法。比赛的规则是方法必须在1秒内返回,否则我们就会杀死调用它们的任务。然后我们使用该转弯的默认结果。

该方法不支持取消,因为我们不能信任被叫代码来响应取消。我们需要终止该线程,因为如果我们有10或20个被忽略的后台任务,那么所有前进的调用将在每次调用时提供更少的时钟周期,并且之前花费不到1秒的方法现在需要更多。

从好的方面来说,我们要杀的方法应该没有资源打开等等,所以中止不应该留下任何东西。

更新:这里要记住两件事。首先,这就像一场比赛 - 所以表现很重要。其次,工作线程不太可能打开任何资源。如果其中一个被调用的方法过长,我需要中止它并继续快速前进。

3 个答案:

答案 0 :(得分:2)

您应该使用低权限在自己的AppDomain中运行每个参赛者。这有几个好处:

  1. 这是沙箱
  2. 它无法与流程中的任何其他代码进行交互
  3. 强制卸载AppDomain相对干净。
  4. 即使您更喜欢通过卸载AppDomain来杀死线程,我仍然会将每个参赛者放入AppDomain以获得隔离。

    不幸的是Thread.Abort还不够。它仍然执行finally条款,可以根据需要执行。

答案 1 :(得分:1)

我建议你在第二个进程中运行代码并仔细定义与之通信的接口,以确保它可以处理不接收响应。大多数操作系统都是为了在杀死进程后进行相当好的清理。

对于通信,您应该避免使用.NET远程处理,因为这似乎可能会在服务器端保持不一致状态。其他一些选择:套接字,命名管道,Web服务。

答案 2 :(得分:1)

Thread.Interrupt()方法可能就是你要找的。

正如MSDN文档所述,“如果此线程当前未在等待,休眠或加入状态中被阻止,则在下一次开始阻塞时它将被中断。”

它不是中止,它会强制正在运行的线程在线程进入等待状态时抛出ThreadInterruptedException。

然后你可以在另一个超时的线程中使用一个计时器来检查线程是否真的不想终止,如果线程拒绝终止,例如30秒,你可以中止它。