Какова наилучшая практика для предоставления метода / класса / компонента, который поддерживает отмену? - PullRequest
1 голос
/ 16 января 2009

Как вы разрабатываете метод / класс, который должен поддерживать отмену операции?

Я понял, что никогда не буду делать это последовательно и хочу это изменить.

Некоторые из вещей, которые я использовал:

  • логическое свойство класса IsCancelled, которое я синхронизирую внутри. иногда у меня есть свойство CanCancel, если операция не может быть отменена в любой момент времени
  • передать делегату Func , который я неоднократно вызываю, чтобы узнать, была ли операция отменена.
  • прервать поток вручную - хотя это определенно плохая практика

Как ты обычно это делаешь?

Ответы [ 3 ]

1 голос
/ 16 января 2009

Вернитесь к варианту использования: какое поведение вы пытаетесь обеспечить? Если у вас есть асинхронная операция, которую вы хотите отменить, то, вероятно, лучше всего реализовать метод, позволяющий уведомлять другой поток с помощью флага или семафора. Отправка сигнала - хороший способ привлечь его внимание, хотя я не изучал обработку сигналов в C #. Если вам нужна возможность отмены и отмены, полезен шаблон Command.

1 голос
/ 10 февраля 2012

Я бы пошел на CancellationTokenSource и используя связанные с ним CancellationToken как средство сигнализации отмены. Это новое в .Net Framework v4.

Концепция заключается в том, что CancellationTokenSource просто вызывает Cancel, и ваш код может поделиться CancellationToken s, на котором вы регулярно проверяете свойство IsCancellationRequested в нем. Это особенно важно в случае циклов с ограниченным циклом или более длительных операций, чтобы ваш код мог своевременно останавливаться.

Дополнительным бонусом является то, что даже заблокированные потоки, заблокированные из-за ожидания на SemaphoreSlim, ManualResetEventSlim могут сигнализировать о постепенном выходе, поскольку эти классы принимают CancellationToken в своем методе Wait в .Net Framework. v4

Например, посмотрите на: ManualResetEventSlim.Wait с перегрузками, принимающими CancellationToken.

1 голос
/ 16 января 2009

Я бы предпочел использовать идею свойства IsCancelled. Ваш метод фонового потока может проверить его в подходящее время, выполнить любую очистку по мере необходимости и завершить операцию. Если вы используете метод обратного вызова после завершения потока, легко проверить свойство и посмотреть, является ли оно действительным или нет. Я использовал классы рабочих потоков фреймворка, которые использовали эту стратегию в прошлом, и она работала хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...