C#のCalcellation Token

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

超簡単ですね。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です