2012-03-20 2 views
0

WinFormsアプリケーションの問題を解決するためにBackgroundWorkerを使用しました。長時間実行されている操作をキャンセルし、その操作を実行中に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の上で複数のタスクを実行しようとしています知っているが、私はそれが特定の順序で実行されますので、これを解決する方法任意のアイデアを持っていけません。 すべてのヘルプを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

関連する問題