我使用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
我知道我试图在同一个背景工作者上运行多个任务是不允许的,但我不知道如何解决这个问题,所以它按特定顺序运行。 赞美所有帮助!!
答案 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..