Фоновый работник 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