1

多くの方法を試しましたが、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();

出力は次のとおりです。

キャンセル:

これは、キャンセル例外がキャッチされたことを意味しますが、例外自体は空です。私の質問は、ここでキャンセルの例外を取得する方法ですか?

ありがとう

デレク

4

1 に答える 1

2

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

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

詳細については、こちらをご覧ください。

于 2016-11-12T22:03:32.433 に答える