2016-11-12 70 views
0

我嘗試了很多方法,但未能捕獲task.ContinueWith中的取消異常。這有什麼錯在這裏:C#:如何在任務中捕獲取消異常。繼續

CancellationTokenSource tokenSource = new CancellationTokenSource(); 
Task task = new Task(()=> { Thread.Sleep(1000); Console.WriteLine("in task!"); }, tokenSource.Token); 

task.Start(); 
tokenSource.Cancel(); 
task.ContinueWith(t => 
{ 
     if(t.IsCanceled) 
     { 
      AggregateException e = t.Exception; 
      if(e == null) // is true 
       Console.WriteLine("Cancelled: "); 
     } 
}); 

Console.Read(); 

輸出是:

取消:

這意味着取消異常被捕獲,但除了本身是空的。我的問題是如何在這裏取消取消異常?

感謝

德里克

+0

那麼,如果任務被取消,那麼因爲你已經取消了它。如果某項任務出現故障,可能有任何原因,然後您需要排除異常。爲什麼在任務被取消時需要例外?順便說一句如果有任何異常,那麼你只能期望OperationCanceledException。沒有任何意義,以保持例外; o) –

+0

爲什麼你不能只使用't.IsCanceled'測試?這似乎足夠。 – usr

回答

1

取消異常沒有自動拋出你取消的CancellationToken的那一刻,如果你不會被自己的任務將被取消,但沒有會拋出異常,這個拋出異常是爲什麼任務異常屬性爲空。

爲了拋出異常,您應該在任務操作中使用ThrowIfCancellationRequested方法。

更多關於它的信息here

+1

還*不*傳遞'tokenSource.Token'到任務控制器。 – usr