2011-03-02 124 views
10

我有一個任務,如果等待時間結束,我需要取消。例如取消任務

var t = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(5000) // some long running task 
    "do something" 
}); 
Task.WaitAll(new[] {t}, 1000); 

但似乎任務仍然繼續工作。我嘗試使用CancellationTokenSource,但似乎沒有工作。

我證實了這一點通過下面的代碼片斷

static void Main(string[] args) 
     { 
      var cancellationTokenSource = new CancellationTokenSource(); 

      var t = Task.Factory.StartNew(() => { 
       Thread.Sleep(5000); 
       Console.WriteLine("Still working"); 
      }, cancellationTokenSource.Token); 

      Task.WaitAll(new[] {t}, 1000); 

      cancellationTokenSource.Cancel(); 

      Console.ReadLine(); 
     } 

控制檯顯示 「仍在工作」。我認爲這項任務會被取消。

我相信我錯過了一些東西。我錯過了什麼?謝謝。

回答

29

取消令牌不會奇蹟般地取消任何內容。他們只需即可讓以標準化方式檢查取消,例如,通過ThrowIfCancellationRequested

因此,通常你會有一些需要執行大量工作的任務。它定期撥打ThrowIfCancellationRequested,然後任何需要取消任務的代碼將在需要時調用Cancel上的CancellationTokenSource。當下一次檢查取消時,任務將會拋出,一切都會好起來的。

這聽起來像你正在尋找一個非合作取消 - 這將是危險的,因爲正常Thread.Abort是危險的完全相同的原因。讓任務選擇允許自己被取消的點是更清潔的。