如何强制取消任务?

Jea*_*uis 9 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();
Run Code Online (Sandbox Code Playgroud)

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

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

我如何立即中止我的任务?

谢谢.

Jon*_*eet 18

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

你应该Do_something_over_a_long_period_of_time取消你的呼叫取消(即传递令牌,并定期检查它们).

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

  • 在一天结束时,"Do_something_over_a_long_period_of_time"可能是第三方库调用,您无法修改为可以合作取消.因此,能够强行取消这种任务仍然是合法的现实世界要求.是的,杀死它的线程可能是也可能不是安全的,这取决于函数正在做什么工作(I/O等),但是除了"不要这样做"之外,必须有一个最好的方法. (5认同)

Hen*_*man 3

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

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

所以只要你想退出你的进程就没有问题。

请注意,Thread.Abort() 速度很快,但不安全。即使对于退出应用程序也不会,但它很少会导致真正的问题。

  • 我不认为我会说“没有问题” - 如果其中一个后台线程正在编写应用程序下次启动时需要的文件,该怎么办? (8认同)