こんにちは、サイオステクノロジー技術部 武井です。非同期の処理でよく出てくるC#のCalcellation Tokenですが、よくわからず使っていたので、まとめてみました。
CalcellationTokenとは、非同期で実施している処理を途中でキャンセルできるものです。と言っても仕組みは非常に簡単で、非同期処理を実施するメソッドにCalcellationTokenを生成して、そのトークンに対して、cancelメソッドを実行すると、例外が発生するので、それをキャッチすればOKです。
以下がCalcellationTokenを使ったキャンセル処理を実現したコードになります。Windowsフォームアプリケーションで、Formがロードされると同時に5秒毎にコンソールに文字を表示する非同期処理を延々と繰り返しています。ボタンをクリックすると、その処理が中止されます。
public partial class Form1 : Form
{
// CancellationTokenを元となるCancellationTokenSourceを生成します。
private CancellationTokenSource cts = new CancellationTokenSource();
// 5秒毎にコンソールに文字を表示する非同期処理を延々と繰り返す処理です。
// 引数にはCalcellationTokenを渡します。
private async Task InfiniteLoopAsync(CancellationToken ct) {
while (true) {
// CancellationTokenのCancelメソッドが実行されたら、
// OperationCanceledExceptionを発生させるコードです。
ct.ThrowIfCancellationRequested();
await Task.Delay(5000);
Console.WriteLine("無限ループ実行中");
}
}
public Form1()
{
InitializeComponent();
}
private async void Form1_Load(object sender, EventArgs e)
{
// Formがロードされたら、5秒毎にコンソールに文字を表示する非同期処理を
// 延々と繰り返す処理を開始します。
try
{
// 引数にCancellationTokenを渡します。
await InfiniteLoopAsync(cts.Token);
}
catch (OperationCanceledException ce)
{
// キャンセルされたら、つまりCancellationTokenのCancelメソッドが実行されたら、
// 発生するOperationCanceledExceptionをキャッチしてキャンセル処理を行うコードです。
Console.WriteLine("キャンセルされたよ");
}
}
private void Button1_Click(object sender, EventArgs e)
{
// 非同期処理をキャンセルします。
cts.Cancel();
}
}
実行結果です。
無限ループ実行中 無限ループ実行中 無限ループ実行中 例外がスローされました: 'System.OperationCanceledException' (mscorlib.dll の中) 例外がスローされました: 'System.OperationCanceledException' (mscorlib.dll の中) キャンセルされたよ
超簡単ですね。

