Тщательное программирование - единственное, что может его сократить.Даже если вы отмените операцию, у вас может быть ожидающая операция, которая не завершается в течение модного периода времени.Это вполне может быть блокирующая операция, которая заблокирована.В этом случае ваша программа фактически не прекратит работу.
Например, если я вызываю ваш метод CleanUp несколько раз или без вызова Start сначала, у меня возникает ощущение, что это может привести к сбою.
Время ожидания 2 секунды во время очистки кажется более произвольным, чемзапланировано, и я на самом деле зашел бы так далеко, чтобы обеспечить правильное завершение работы или сбой / зависание (вы никогда не захотите оставлять параллельные вещи в неизвестном состоянии).
Кроме того, IsRunning
явно установленне выводится из состояния объекта.
Для вдохновения я хотел бы, чтобы вы посмотрели на похожий класс, который я недавно написал, это шаблон производителя / потребителя, который работает в фоновом потоке.Вы можете найти этот исходный код на CodePlex .Хотя это было разработано для решения очень специфической проблемы.
Здесь отмена решается путем запроса определенного типа, который распознается только рабочим потоком и, таким образом, начинает закрываться.Это также гарантирует, что я никогда не отменю ожидающую работу, учитываются только целые единицы работы.
Чтобы немного улучшить эту ситуацию, у вас может быть отдельный таймер для текущей работы и отмена или откат незавершенной работы, если она отменена.Теперь для реализации поведения, подобного транзакции транзакции , потребуется несколько проб и ошибок, потому что вам нужно посмотреть на каждый возможный случай и спросить себя, что произойдет, если здесь произойдет сбой программы?В идеале все эти пути кода приводят к восстанавливаемому или известному состоянию, из которого вы можете возобновить свою работу.Но, как я думаю, вы уже догадались, для этого потребуется тщательное программирование и много испытаний.