Способ отмены операции BackgroundWorker заключается в вызове BackgroundWorker.CancelAsync()
:
// RUNNING IN UI THREAD
private void cancelButton_Click(object sender, EventArgs e)
{
backgroundWorker.CancelAsync();
}
В обработчике событий BackgroundWorker.DoWork мы проверяем BackgroundWorker.CancellationPending
:
// RUNNING IN WORKER THREAD
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker.CancellationPending) {
DoSomething();
}
}
Вышеупомянутая идея существует во всем Интернете, в том числе на странице MSDN для BackgroundWorker.
Теперь, мой вопрос таков: как это безопасно?
Я просмотрел класс BackgroundWorker в ILSpy - CancelAsync()
просто устанавливает cancelationPending на true без использования барьера памяти, а CancellationPending
просто возвращает cancelationPending без использования барьера памяти.
Согласно этой странице Jon Skeet, вышесказанное не является потокобезопасным. Но документация для BackgroundWorker.CancellationPending говорит:" Это свойство предназначено для использования рабочим потоком, который должен периодически проверять отмену отмены и отменять фоновый режим если для него установлено значение true.
Что здесь происходит? Это поточно-безопасный или нет?