首页 文章

vb.net后台工作人员取消不工作

提问于
浏览
0

我遇到了BackgroundWorker.CancelAsync()无效的问题 . 我将WorkerSupportsCancellation设置为TRUE . 我也在DoWork中轮询BackgroundWorker1.CancellationPending . 这是我想要实现的示例代码 . 我让后台工作程序循环遍历时间戳并为Measurement变量赋值 . 我有一个子程序,查询上次报告的Measurement变量并写入listbox . 在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 回答

  • 1

    你只需要在Do ... Loop中移动检查取消,否则它只会在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
    

相关问题