はじめに
今回は複数のCancellationToken
が存在したとき、いずれか一つでもキャンセルされればキャンセル状態になるCancellationTokenSource
を生成したいと思います。
やり方
実現するためには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)); }