Выполнение одного и того же BackgroundWorker несколько раз в зависимости от состояния? - PullRequest
0 голосов
/ 20 марта 2012

Я использовал BackgroundWorker для решения проблемы в моем приложении winforms, я хотел иметь возможность отменить длительную операцию и видеть результаты в реальном времени в ListBox во время выполнения операции.Работает нормально, кроме случаев, когда я хочу добавить флажок с дополнительным условием.Проблема в том, когда я хочу запустить несколько операций одновременно.Ex.и 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 Ответ

2 голосов
/ 20 марта 2012

Просто скажите работнику, какие тесты ему необходимо выполнить. Начните с перечисления, объявляющего тесты:

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