2012-03-20 6 views
0

Я использовал BackgroundWorker для решения проблемы в моем приложении winforms, я хотел иметь возможность отменить длительную операцию и видеть результаты в реальном времени в ListBox во время выполнения операции. Он отлично работает, за исключением случаев, когда я хочу добавить флажок с дополнительными условиями. Проблема заключается в том, что я хочу запустить сразу несколько операций. Ex. как XX, так и YY, выполняющие XX, а затем начинаются с YY в этом порядке.Выполнение того же BackgroundWorker несколько раз в зависимости от условия?

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 

Я знаю, что я пытаюсь выполнить несколько задач на одном BackgroundWorker, которые не разрешены, но я не имею ни малейшего представления, как решить эту проблему, так что работает в определенном порядке. Назначьте всю помощь !!

ответ

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 

и настроить код работника, чтобы проверить принятый аргумент для каждого теста:

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.. 
+0

Спасибо Гансу !!! Ты король! Решила мою проблему при первом выстреле! – Haris