В настоящее время у меня есть приложение, в котором я создаю серию задач, которые выполняются одну за другой, с источником отмены, который может прерывать выполнение между задачами (то есть в точках безопасного завершения). В настоящее время я использую этот источник отмены только тогда, когда управляющий класс Disposed , как способ аккуратно и быстро прервать выполнение.
Теперь у меня есть вариант использования, в котором я хотел бы создать автоматический тайм-аут для отмены последовательности задач в случае, если оператор не отвечает своевременно (некоторые задачи ожидают взаимодействия оператора с физическим механизмом). В то же время мне все еще нужно поддерживать отмену, если управляющий класс находится в состоянии Disposed. Я нашел CancellationTokenSource.CreateLinkedTokenSource, который звучит как то, что мне нужно, но я есть несколько проблем:
Несколько серий задач могут выполняться параллельно, поэтому мне нужно создать новый CancellationTokenSource для отмены тайм-аута и связанный связанный источник для каждой серии задач, которую я начинаю. CancellationTokenSource реализует IDisposable, что означает, что мне нужно сохранить оба источника отмены и удалить их после завершения последней задачи или при отмене или сбое любой из подзадач. Это кажется довольно неудобным, даже с учетом полезной магии анонимных закрытий методов (эти источники отмены все еще распространяются).
Мне также нужно защитить от состояния, при котором источники отмены удаляются до истечения таймера (поэтому я не отменяю удаленный источник). Это потенциальное состояние гонки, поэтому мне нужно добавить соответствующую блокировку. Это также кажется неудобным, добавляет значительную сложность (будущие затраты на обслуживание) и усложняет модульное тестирование (сложно вызвать условия гонки).
Я иду по правильному пути или есть более простой способ сделать это?