前提・実現したいこと
Task.WhenAny()
を使用して,2つのタスクの実行を行っています.
しかし,CancellationToken
を使用して実行中のタスクをキャンセルした際にOperationCancelledException
がキャッチできなくて困っております.
該当のソースコード
C#
1CancellationTokenSource tokenSource; 2void Start() 3{ 4 tokenSource = new CancellationTokenSource(); 5 var _ = DoProcess(tokenSource.Token); 6} 7 8void Stop() 9{ 10 if (tokenSource != null) tokenSource.Cancel(); 11} 12 13async Task DoProcess(CancellationToken token) 14{ 15 try 16 { 17 // これはうまくいく 18 //await Task.Run(() => A(token), token); 19 20 // これもうまくいく 21 //await Task.Run(() => B(token), token); 22 23 // これだと例外をキャッチしてくれない 24 await StartDualTasks(token); 25 } 26 catch (Exception e) 27 { 28 Console.WriteLine($"例外: {e.Message}"); 29 } 30 finally 31 { 32 tokenSource.Dispose(); 33 tokenSource = null; 34 } 35} 36 37async Task StartDualTasks(CancellationToken token) 38{ 39 List<Task> tasks = new List<Task>() 40 { 41 Task.Run(() => A(token), token), 42 Task.Run(() => B(token), token), 43 }; 44 45 await Task.WhenAny(tasks); 46} 47 48void A(CancellationToken token) 49{ 50 while(/*condition*/) 51 { 52 // 処理 53 token.ThrowIfCancellationRequested(); 54 } 55} 56 57void B(CancellationToken token) 58{ 59 while(/*condition*/) 60 { 61 // 処理 62 token.ThrowIfCancellationRequested(); 63 } 64} 65
試したこと
試しにA
, B
それぞれ単体で実行してみたところ,問題なく例外が発生してくれました.
しかし,2つを同時にスタートするとうまくいきません.
Task.WhenAny
を使用するときは特殊な例外のハンドリングが必要なのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/26 10:17
2019/07/26 10:22
2019/07/26 14:16