2016-11-12 11 views
0

多くの方法を試しましたが、task.ContinueWithで取り消し例外をキャッチできませんでした。C#:task.continuewithで取り消し例外をキャッチする方法

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

タスクがキャンセルされた場合は、キャンセルしたためです。タスクにフォールトが発生した場合は、何らかの理由がある可能性があります。その場合、例外が必要です。タスクがキャンセルされたときに例外が必要なのはなぜですか? BTW例外があった場合は、OperationCanceledExceptionのみしか期待できません。例外を維持する意味がありませんでした; o) –

+0

なぜ 't.IsCanceled'テストを使用できませんか?それは十分だと思われる。 – usr

答えて

1

あなたは、タスクがキャンセルされますが、例外がスローされません自分でこれを例外をスローしない場合はキャンセル例外が自動的に、あなたがCancellationTokenを取り消す瞬間をスローされませんタスクExceptionプロパティがnullの理由です。

例外をスローするには、タスクアクションの1つにThrowIfCancellationRequestedメソッドを使用する必要があります。

さらに詳しい情報here

+1

また、 'tokenSource.Token'をTaskCtorに渡しません。 – usr

関連する問題