C#
定石5: CancellationTokenでキャンセル可能にする
出典: WinForms 非同期処理の正解 — BackgroundWorker / Task.Run / async-await の使い分け — 定石5: CancellationTokenでキャンセル可能にする
// ✅定石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 は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石5: CancellationTokenでキャンセル可能にする」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
5 件// ✅定石1: BackgroundWorkerでファイル取り込み using System.ComponentModel; public partial class ImportForm : Form未収録
定石1: BackgroundWorker —旧式だがDesigner配置できる
#df48c972d049
// ✅定石2: Task.Run + Control.Invoke using System.Threading.Tasks; public partial class ImportForm : Form未収録
定石2: Task.Run + Control.Invokeでモダンに書く
#17558f5f8cdc
// ✅定石3: async-await + Task.Run(新規プロジェクトの本命) using System.Threading.Tasks; public partial class ImportForm : Form未収録
定石3: async-await + Task.Run —新規プロジェクトの本命
#08f2e9eba268
// ✅定石4: IProgress<T>で進捗報告(async-await版BackgroundWorker.ReportProgress) using System; using System.Threading.Tasks;未収録
定石4: IProgressで進捗をUIに細かく反映
#8291000709ca
// ❌ NG: UIスレッドでWait()/ Resultを呼ぶとデッドロック private void btnStart_Click(object sender, EventArgs e) { var result = Task.Run(()=> DoHeavyWork()).Result; // ← UIスレッド固まる未収録
定石6: Wait()/ Resultでデッドロック—業務系の禁忌パターン
#a9b2d6704a87
