如何强制取消任务?

时间:2011-03-14 13:19:18

标签: c# multithreading task task-parallel-library

假设,有一项任务包含以下约:

Task someTask = new Task(() => {

  while(!IsCancellationRequested) {

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();
  }
});
someTask.Start();

并且有非常不耐烦的用户。他们渴望立即终止我的申请。他们不想等待长时间的行动。

我以前使用Thread类,并且能够通过调用Abort()命令立即中止我的所有线程。

如何立即中止我的任务?

谢谢。

2 个答案:

答案 0 :(得分:18)

您无法强制任务以不合作的方式中止。以不受控制的方式中止线程是不安全的,因此故意不受支持。

您应该取消Do_something_over_a_long_period_of_time来电(即将令牌传递给他们,并定期检查他们)。

编辑:如另一个答案中所述,您可以通过确保所有前台线程都已终止来终止应用程序。但是你需要知道你的任务不一定有机会彻底终止干净。如果他们正在编写文件,你可能要等到注意到取消,以避免破坏持久状态。

答案 1 :(得分:2)

  

他们很想立即终止我的申请。他们不想等待长时间的行动。

默认情况下,Tasks在ThreadPool上作为后台任务运行。您可以安全地退出应用程序而无需担心后台线程。

因此,只要您想退出流程就没有问题。

请注意,Thread.Abort()很快但不安全。甚至不是戒烟申请,但它很少会导致真正的问题。