【C#】CancellationTokenSource.CreateLinkedTokenSourceでいずれかのCancellationTokenがキャンセルされたらキャンセル扱いにする

いずれかのCancellationTokenがキャンセルされたらキャンセル扱いにするCancellationTokenSource.CreateLinkedTokenSource の使い方です。

やりたいこと

非同期メソッドではキャンセルを行うための引数としてCancellationTokenを取ります。

public async Task Example(CancellationToken cancellationToken = default);

これをキャンセル状態にすれば非同期メソッドの処理がキャンセルされるわけですが、キャンセルが実行される条件を二つ作りたい場合があります。

そんな時には、それぞれの条件でキャンセルが行われるCancellationTokenを二つ作成し、CancellationTokenSource.CreateLinkedTokenSourceでそれらをまとめたCancellationTokenを作成することができます。
まとめたCancellationTokenは、元となるCancellationTokenのいずれかがキャンセルされるとキャンセル扱いになります。

使い方

使い方は以下の通りです。

public class Tests
{
    [Test]
    public void Test()
    {
        // 二つCancellationTokenSourceを作る
        var cts1 = new CancellationTokenSource();
        var cts2 = new CancellationTokenSource();
        // 上記二つのCancellationTokenSourceをリンクしたCancellationTokenSourceを作る
        var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts1.Token, cts2.Token);

        // 一つ目のCancellationTokenSourceをキャンセルする
        cts1.Cancel();
        
        // 結果
        Assert.Multiple(() =>
        {
            // 一つ目はキャンセル
            Assert.That(cts1.IsCancellationRequested, Is.True);
            // 二つ目はキャンセルされていない
            Assert.That(cts2.IsCancellationRequested, Is.False);
            // リンクしたCancellationTokenSourceは、一つ目がキャンセルされたのでキャンセル扱い
            Assert.That(linkedCts.IsCancellationRequested, Is.True);
        });
    }
}

参考

learn.microsoft.com