如何中止.NET任务?

Dav*_*len 6 .net c# task abort task-parallel-library

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

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

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

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

Cod*_*aos 2

您应该以低权限在每个参赛者自己的 AppDomain 中运行。这有几个优点:

  1. 它是沙盒的
  2. 它不能与进程中的任何其他代码交互
  3. 强制卸载AppDomain相对干净。

即使您更喜欢终止线程而不是卸载 AppDomain,我仍然会将每个参赛者放入 AppDomain 中以获得隔离。

不幸的Thread.Abort是还不够。它仍然执行finally可以根据需要执行多长时间的子句。