はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】複数のCancellationTokenを合成したCancellationTokenSourceを生成する

はじめに

今回は複数のCancellationTokenが存在したとき、いずれか一つでもキャンセルされればキャンセル状態になるCancellationTokenSourceを生成したいと思います。

docs.microsoft.com

やり方

実現するためにはCancellationTokenSource.CreateLinkedTokenSourceというメソッドを利用します。

public static System.Threading.CancellationTokenSource CreateLinkedTokenSource (System.Threading.CancellationToken token);
public static System.Threading.CancellationTokenSource CreateLinkedTokenSource (params System.Threading.CancellationToken[] tokens);
public static System.Threading.CancellationTokenSource CreateLinkedTokenSource (System.Threading.CancellationToken token1, System.Threading.CancellationToken token2);

オーバーロードが3つありますが、基本は上から2,3番目のものを利用する形になると思います。
(1個目のオーバーロードだけ適用された.NETがかなり限定されているので注意)

[Test]
public void CreateLinkedTokenSourceTest()
{
    // 複数のCancellaitonTokenSource
    var source1 = new CancellationTokenSource();
    var source2 = new CancellationTokenSource();
    var source3 = new CancellationTokenSource();

    // 2個目のオーバーロード
    var result1 = CancellationTokenSource.CreateLinkedTokenSource(new[] { source1.Token, source2.Token, source3.Token });

    // 3個目のオーバーロード
    var result2 = CancellationTokenSource.CreateLinkedTokenSource(source1.Token, source2.Token);

    source1.Cancel();

    // result1, result2共にキャンセル要求されている
    Assert.That(result1.IsCancellationRequested, Is.EqualTo(true));
    Assert.That(result2.IsCancellationRequested, Is.EqualTo(true));
}