Ваш обработчик событий DoWork
должен периодически проверять BackgroundWorker.CancellationPending
и устанавливать DoWorkEventArgs.Cancel
в true перед возвратом, если он был отменен.
Ваш обработчик событий RunWorkerCompleted
должен проверить свойство RunWorkerCompletedEventArgs.Cancelled
, чтобы определить, отменен ли обработчик событий DoWork
(установите для DoWorkEventArgs.Cancel
значение true).
В случае состояния гонки может случиться так, что пользователь запросил отмену (BackgroundWorker.CancellationPending
верно), но работник не увидел его (RunWorkerCompletedEventArgs.Cancelled
неверно). Вы можете проверить эти два свойства, чтобы определить, что это произошло, и делать все, что вы выберете (либо рассматривать его как успешное завершение - потому что работник действительно закончил успешно, либо как отмену - потому что пользователь отменил и не заботится больше).
Я не вижу ситуации, в которой есть какая-то двусмысленность в том, что произошло.
EDIT
В ответ на комментарий - если существует несколько классов, которые должны обнаружить CancellationPending
, на самом деле нет никакой альтернативы передаче этим классам ссылки на тип, такой как BackgroundWorker
, который позволяет им получать эту информацию. Вы можете абстрагировать это в интерфейс, что я обычно делаю, как описано в этом ответе на вопрос о BackgroundWorkers. Но вам все равно нужно передать ссылку на тип, который реализует этот интерфейс, вашим рабочим классам.
Если вы хотите, чтобы ваши рабочие классы могли устанавливать DoWorkEventArgs.Cancel
, вам нужно будет либо передать ссылку на это, либо принять другое соглашение (например, логическое возвращаемое значение или пользовательское исключение), которое позволяет вашим рабочим классам указать, что отмена произошла.