私は現在、次々に実行される一連のタスクを作成するアプリケーションを持っており、タスク間の実行を中断できるキャンセル ソースを使用します (つまり、安全な終了ポイントで)。現在、このキャンセル ソースは、管理クラスが Disposed の場合にのみ使用します。 、クリーンかつ迅速に実行を中止する方法として。
オペレーターがタイムリーに応答しない場合に備えて、自動タイムアウトを作成してタスク シーケンスをキャンセルするユース ケースがあります (一部のタスクは、物理メカニズムとのオペレーターの対話を待機します)。同時に、管理クラスが Disposed の場合はキャンセルをサポートする必要があります。CancellationTokenSource.CreateLinkedTokenSourceを見つけました。これは必要なように思えますが、いくつか懸念事項があります。
複数のタスク シリーズを並行して実行できるため、タイムアウトのキャンセル用に新しい CancellationTokenSource を作成し、開始する各タスク シリーズに関連するリンクされたソースを作成する必要があります。CancellationTokenSource は IDisposable を実装しています。つまり、最後のタスクが完了したとき、またはサブタスクのいずれかが Canceled または Faulted になったときに、両方のキャンセル ソースを保持して Dispose する必要があります。これは、匿名メソッド クロージャの便利な魔法を使用しても、かなりぎこちないように思えます (これらのキャンセル ソースはまだ渡されています)。
また、タイマーが切れる前にキャンセル ソースが破棄される状態から保護する必要があります (したがって、破棄されたソースをキャンセルしません)。これは競合状態になる可能性があるため、適切なロックを追加する必要があります。これも厄介なようで、かなりの複雑さ (将来のメンテナンス コスト) が追加され、単体テストがより困難になります (競合状態を確実に誘発するのは難しいです)。
ここで正しい道を進んでいますか、それとももっと簡単な方法がありますか?