こんにちは、サイオステクノロジー技術部 武井です。非同期の処理でよく出てくる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 の中) キャンセルされたよ
超簡単ですね。