2011-03-14 56 views
8

假设,存在包含以下操作大约一个任务:如何强制取消任务?

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()命令立即中止所有线程。

如何立即中止我的任务?

谢谢。

+1

你看过BackgroundWorker吗? – HadleyHope 2011-03-14 13:26:05

+0

@HadleyHope后台工作人员如何解决他的问题。它支持以与Tasks – Kugel 2011-07-15 09:52:20

回答

2

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

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

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

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

+6

我不认为我会说“没有问题” - 如果其中一个后台线程是通过写入应用程序在下次启动时需要哪些文件? – 2011-03-14 13:35:31

+0

我忘了ThreadPool和后台任务。现在它工作正常。谢谢。 – 2011-03-14 14:03:12

+0

@Jon你原则上是对的,但OP用来使用Thread.Abort()... – 2011-03-14 15:28:17

18

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

你应该让你的Do_something_over_a_long_period_of_time呼叫取消而不是(即通过他们的令牌,并使他们他们也定期检查)。

编辑:正如在另一个答案中指出的,你可以杀死应用程序只是通过确保所有的前台线程已终止。但是你需要知道你的任务不一定有机会干净地终止。如果他们正在写文件等事情,那么您可能需要等到取消注意事项后才能使用,以避免破坏持久状态。

+0

类似的方式取消谢谢。这对我来说非常有用。 – 2011-03-14 14:01:35

+0

因此,如果我启动一个只调用单个方法GetDataThatRunsForTheNext40secs()的新任务,那么是否无法立即从外部取消任务?这种取消的结果并不重要 - 但我希望我的CPU能够尽快做出有用的事情。想法? – Gishu 2012-11-21 10:34:45

+0

@Gishu:我不知道有什么办法可以安全地做到这一点,而没有任何问题的合作。 – 2012-11-21 10:36:04