根据条件多次执行相同的BackgroundWorker?

时间:2012-03-20 10:16:09

标签: vb.net backgroundworker

我使用BackgroundWorker来解决winforms应用程序中的问题,我希望能够取消长时间运行的操作,并在执行操作时在ListBox中查看结果。它工作正常,除非我想添加一个附加条件的复选框。 问题是我想一次运行几个操作。防爆。 XX和YY首先执行XX,然后按顺序从YY开始。

Private Sub UpdateDB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTestAll.Click
       If cbxTestYY.Checked OrElse cbxTesteXX.Checked Then
        SetBusyState(True)

           If cbxTestXX.Checked Then
             bkWorker.RunWorkerAsync(1)
           End If
           If cbxTesteYY.Checked Then
             bkWorker.RunWorkerAsync(2)
           End If
       End If
End Sub


Private Sub bkWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bkWorker.DoWork
    If bkWorker.CancellationPending Then
         e.Cancel = True
         Exit Sub
      Else
         If e.Argument = 1 Then
            AddItemToListBox("", "XX")
            TestUnits(_XXDimensionUnits, True)
            AddItemToListBox("    Calculating Units     ")
            TestUnits(_XXCalculationUnits, False)
         End If
         If e.Argument = 2 Then
            AddItemToListBox("", "YY")
            TestUnits(_YYCalculationUnits, False)
         End If
      End If
End Sub

我知道我试图在同一个背景工作者上运行多个任务是不允许的,但我不知道如何解决这个问题,所以它按特定顺序运行。 赞美所有帮助!!

1 个答案:

答案 0 :(得分:2)

告诉工作人员需要执行哪些测试。从枚举开始,声明测试:

<Flags()> _
Private Enum TestsToPerform
    None   = 0
    TestXX = 1
    TestYY = 2
    TestZZ = 4  '' etc, note the value.  Next are 8, 16, 32, 64 etc.
End Enum

开始这样的测试:

    Dim tests As TestsToPerform = TestsToPerform.None
    If cbxTestXX.Checked Then tests = tests Or TestsToPerform.TestXX
    If cbxTestYY.Checked Then tests = tests Or TestsToPerform.TestYY
    If cbxTestZZ.Checked Then tests = tests Or TestsToPerform.TestZZ
    If tests <> TestsToPerform.None Then
        SetBusyState(True)
        bkWorker.RunWorkerAsync(tests)
    End If

调整worker中的代码以测试每个测试的传递参数:

    Dim tests As TestsToPerform = DirectCast(e.Argument, TestsToPerform)
    If tests And TestsToPerform.TestXX Then
        '' do test xx
    End If
    If tests And TestsToPerform.TestYY Then
        '' do test yy
    End If        
    '' etc..