.NETのWebClientで非同期処理をキャンセルする

提供: MonoBook
2021年3月8日 (月) 07:32時点におけるAdministrator (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

一般的なTaskを用いた非同期処理では、

  • キャンセル依頼はCancellationTokenSourceのCancelメソッド
  • キャンセル時の例外はOperationCanceledException
try 
{
    await HogeHogeTaskAsync(cancellationTokenSource.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("cancel");
}


一方、WebClientの○○TaskAsync系メソッドにはCancellationTokenSourceを指定する引数がなく、

  • キャンセル依頼はWebClientのCancelAsyncメソッド
  • キャンセル時の例外はWebException
    • StatusプロパティにRequestCanceledが設定されている
try
{
    await webclient.DownloadStringTaskAsync("http://localhost:53701/hello?wait=10000");
}
catch (WebException we)
{
    if (we.Status == WebExceptionStatus.RequestCanceled)
    {
        Console.WriteLine("cancel");
    }
    else 
    {
        throw;
    }
}