Отмена задачи с несколькими источниками

В настоящее время у меня есть приложение, в котором я создаю серию Задач, которые выполняются одна за другой, с источником отмены, который может прерывать выполнение между Задачами (т.е. в точках безопасного завершения). В настоящее время я использую эту отмену источник только тогда, когда управляющий класс Disposed, как способ аккуратно и быстро прервать выполнение.

Теперь у меня есть вариант использования, в котором я хотел бы создать автоматический тайм-аут для отмены последовательности задач, если оператор не t отвечать своевременно (некоторые задачи ожидают взаимодействия оператора с физическим механизмом). В то же время мне все еще необходимо поддерживать отмену, если управляющий класс находится в состоянии Disposed. Я обнаружил CancellationTokenSource.CreateLinkedTokenSource , что похоже на то, что мне нужно, но у меня есть несколько опасений:

  1. Несколько серий задач могут выполняться параллельно, поэтому мне нужно создать новый CancellationTokenSource для отмены тайм-аута и связанный связанный источник для каждой задачи -серию, которую я начинаю. CancellationTokenSource реализует IDisposable, что означает, что мне нужно сохранить оба источника отмены и удалить их, когда завершится последняя задача или когда какая-либо из подзадач отменена или сбой. Это кажется довольно неудобным, даже с полезной магией анонимных закрытий методов (все еще передаются эти источники отмены).

  2. Мне также нужно защитить себя от условия, при котором источники отмены удаляются до истечения таймера (так что я не 't Отменить удаленный источник.) Это потенциальное состояние гонки, поэтому мне нужно добавить соответствующую блокировку. Это также кажется неудобным, добавляет значительную сложность (будущие затраты на обслуживание) и усложняет модульное тестирование (сложно вызвать условия гонки)

Я иду по правильному пути или есть более простой способ сделать это?

6
задан Dan Bryant 7 June 2011 в 17:13
поделиться