Фоновый работник vb.net отменить не работает

У меня возникла проблема, когда BackgroundWorker.CancelAsync() не работает. У меня WorkerSupportsCancellation установлен в TRUE. Я также опрашиваю BackgroundWorker1.CancellationPending в DoWork. Вот пример кода того, чего я пытаюсь достичь. У меня есть фоновый работник, проходящий по метке времени и присваивающий значение переменной Measurement. У меня есть подпрограмма, которая запрашивает последнюю сообщенную переменную измерения и записывает в список. После 5 циклов отправляю BackgroundWorker.CancelAsync(). Я вижу, что отмена ожидается, но на самом деле она не отменяет фонового работника. Это состояние гонки?

Public Class Form1

Dim Measurement As String
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    BackgroundWorker1.RunWorkerAsync()
    Delay(0.5)

    For x = 1 To 5
        ListBox1.Items.Add(Measurement)
        ListBox1.TopIndex = ListBox1.Items.Count - 1
        TextBox1.Text = BackgroundWorker1.CancellationPending
        Delay(1)
    Next

    BackgroundWorker1.CancelAsync()

    TextBox1.Text = BackgroundWorker1.CancellationPending
    ListBox1.Items.Add("Cancel Pend: " & BackgroundWorker1.CancellationPending)
    Delay(5)
    ListBox1.Items.Add("Busy: " & BackgroundWorker1.IsBusy)

End Sub

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    If BackgroundWorker1.CancellationPending = True Then
        e.Cancel = True
        BackgroundWorker1.Dispose()
        Exit Sub
    Else
        Do
            Measurement = Now()
        Loop
    End If

End Sub

Конечный класс

1 ответ

Решение

Вам просто нужно переместить проверку отмены внутри цикла Do..., иначе она будет проверена только в начале обработчика события DoWork и никогда после этого.

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    If BackgroundWorker1.CancellationPending = True Then
        e.Cancel = True
        BackgroundWorker1.Dispose()
    Else
        Do
          If BackgroundWorker1.CancellationPending = True Then
            e.Cancel = True
            BackgroundWorker1.Dispose()
            Exit Do
          Else 
             Measurement = Now()
          End If
        Loop
    End if
End Sub
Другие вопросы по тегам