2012-03-20 4 views
0

WinForms 응용 프로그램에서 BackgroundWorker를 사용하여 문제를 해결했지만 장기 실행 작업을 취소하고 작업을 실행하는 동안 ListBox에 결과가 표시되도록하고 싶습니다. 추가 조건이있는 확인란을 추가하려는 경우를 제외하고는 정상적으로 작동합니다. 한 번에 여러 작업을 실행하려고 할 때 문제가 발생합니다. 전의. 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에 여러 작업을 실행하려고 알고 있지만, 나는이 그래서 특정 순서로 실행을 해결하는 방법을 어떤 생각을 가지고 있겠지. 모든 도움말 Appriciate !!

답변

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

관련 문제