投稿者 るきお  (社会人) 投稿日時 2020/5/28 21:41:15
実行中のタスクと、タスクの外側で _cts を共有しているところに難しさがあって、キャンセル操作時に _cts の New が先に実行されてしますと、タスク内で _cts を参照するところで、タスク開始時の _cts とは違うものを参照することになってしまいます。
それで、Newするまでの間に少し猶予 Task.Delay(20).Wait() を入れてみました。
ご認識の通り時間で指定しているところが良くないところなんですよね。

試してはいませんが、タスク側で処理が終わった時点でフラグをたてて、フラグが立っているのを確認してから_cts を New するなど時間に依存しないロジックが書ければそちらの方が良いと思います。

とりあえず Task.Delay(20).Wait() の 20 を大きくするだけでも安定性は上がるので、この処理のクリティカル具合によってはこれでも妥協できるかもしれませんが・・・。