例外をスローせずに実行される次のコードがあります。
var t = Task.Factory.StartNew(() => LongRunningMethod(cancellationToken, progress), cancellationToken);
t.ContinueWith(Callback, TaskScheduler.FromCurrentSynchronizationContext());
'LongRunningMethod'内で、cancellationToken.ThrowIfCancellationRequested()を呼び出します。コールバックは常に呼び出され(これは私が望むものです)、コールバックに正しく渡されるタスクでは、IsCancelledがtrueまたはfalseに設定されています。
async / awaitキーワードを使用して、上記の行を次のように変更する必要があります。
try
{
await Task.Factory.StartNew(() => LongRunningMethod(cancellationToken, progress), cancellationToken);
textEdit1.Text = "Done";
}
catch (OperationCanceledException)
{
textEdit1.Text = "Cancelled";
}
この場合、なぜThrowIfCancellationRequested()がキャッチする必要のある実際の例外をスローするのですか?