0

合格または不合格の詳細を示す生徒のテストの概要を取得するレポートを実行する必要があります。 cmd_Startをクリックすると、Backgroundworkerで実行されます(私はマルチスレッドとして実行したい、人々はバックグラウンドワーカーを使うことを提案しています)。すべての計算が完了すると結果がメッセージボックスにポップアップ表示されます。私は他の例でいくつかのコードをコピーして編集しましたが、私は疑問符を付けたコードに何を置くべきか分かりません。他のアイデアも大歓迎です。VB.netバックグラウンド渡しのパラメータと戻り値

Dim Passed as int32= 0 
    Dim Failed as int32 = 0 
    Dim Total as int32 = 0 

    Private Sub cmd_Start_Click(sender As Object, e As EventArgs) Handles cmd_Start.Click 
    Passed= 0 
    Failed = 0 
    Total = 0 
    For i as int32 = 0 to ubound(StudentIDAry) 
     Dim worker As New System.ComponentModel.BackgroundWorker 
     AddHandler worker.DoWork, ????? CountAverageScore(????,????, StudentIDAry(i)) 
     AddHandler worker.RunWorkerCompleted, AddressOf HandleThreadCompletion 
     worker.RunWorkerAsync() 
    Next 
    MsgBox("Total Counted: " & Total & vbcrlf & "Passed Count: " & Passed & vbcrlf & "Failed Count: " & Failed) 
    End Sub 

    Private Sub CountAverageScore(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs, ByVal StudentID As Long) 
    Dim stroutput As String = e.Argument.ToString 
    .......... 
    .......... 
    e.Result = stroutput 
    End Sub 

    Private Sub HandleThreadCompletion(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) 
    Dim return_value As String = e.Result.ToString 
    If cint(return_value)>=50 Then 
     Passed = Passed + 1 
    Else 
     Failed = Failed + 1 
    End If 
    Total = Total + 1 
End Sub 
+0

を使用しています。渡す変数は1つだけなので、単にRunWorkerAsyncに渡して、CLng(e.Argument)を使ってイベントハンドラで再度取得することができます。 –

答えて

-1

あなた自身のバックグラウンドワーカーを追加するコードをすべて使用するのではなく、これを試してください。 Parallel.Forを使用し、ループ内のすべてを独自のスレッドで実行します。

Parallel.Forの構造はかなり単純ですが、ループの最後の反復を示す数字は排他的であることを覚えておくことが重要です。

たとえば、通常のループFor I As Integer =0 to 100では、ループはParallel.Forのループで最後の反復は99になります。迷惑ですが、それはどのようなものですか。

マルチスレッドのパフォーマンスのオーバーヘッドが原因でコードが高速に実行されないことがあります。また、並列ループでの実行速度を通常のループと比べて調べる価値があります。

私がStudentStructを使用する場所では、個々の学生を表現するために使用しているオブジェクトに変更するのを忘れないでください。

Private Sub cmd_Start_Click(sender As Object, e As EventArgs) Handles cmd_Start.Click 
    Passed = 0 
    Failed = 0 
    Total = 0 
      Parallel.For(0, UBound(StudentIDAry) + 1, 
             Sub(index As Integer) 
              Dim studentAverage As Integer = CInt(CountAverageScore(StudentIDAry(index))) 
              If CInt(studentAverage) >= 50 Then 
               Passed = Passed + 1 
              Else 
               Failed = Failed + 1 
              End If 
              Total = Total + 1 
             End Sub) 
    MsgBox("Total Counted: " & Total & vbCrLf & "Passed Count: " & Passed & vbCrLf & "Failed Count: " & Failed) 
End Sub 


Private Function CountAverageScore(student As StudentStruct) As Single 
    Dim score As Integer 
    ' 
    ' 
    ' 
    Return score 
End Function 

ディッチすべてのBackgroundWorkerのコードは、ちょうどあなたが任意のBackgroundWorkerによって提供されているイベントハンドラ、送信者と電子に引数を追加することはできません上記

関連する問題