2011-03-14 54 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