動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石5: CancellationTokenでキャンセル可能にする

出典: WinForms 非同期処理の正解 — BackgroundWorker / Task.Run / async-await の使い分け定石5: CancellationTokenでキャンセル可能にする

定石5: CancellationTokenでキャンセル可能にする (csharp)#cdf2b4fdbd67
// ✅定石5: CancellationTokenでキャンセル可能
using System.Threading;
using System.Threading.Tasks;
 
public partial class ImportForm : Form
{
    private CancellationTokenSource _cts;
 
    private async void btnStart_Click(object sender, EventArgs e)
    {
        _cts = new CancellationTokenSource();
        btnStart.Enabled = false;
        btnCancel.Enabled = true;
 
        try
        {
            await Task.Run(()=> DoHeavyWork(_cts.Token), _cts.Token);
            lblStatus.Text = "完了";
        }
        catch (OperationCanceledException)
        {
            lblStatus.Text = "キャンセルされました";
        }
        finally
        {
            btnStart.Enabled = true;
            btnCancel.Enabled = false;
            _cts.Dispose();
        }
    }
 
    private void btnCancel_Click(object sender, EventArgs e)
    {
        _cts?.Cancel();   // CancellationTokenSource経由でキャンセル要求
    }
 
    private void DoHeavyWork(CancellationToken ct)
    {
        for (int i = 0; i < 100; i++)
        {
            ct.ThrowIfCancellationRequested();   //キャンセル時に例外で抜ける
            Thread.Sleep(50);
        }
    }
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
  • id: #cdf2b4fdbd67
  • lines: 45
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「定石5: CancellationTokenでキャンセル可能にする」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

5
図鑑トップ