0

我需要运行一个报告,获取学生测试的摘要,其中显示通过或失败的细节。当点击cmd_Start时,它会在每个学生的Backgroundworker上运行(我只是想以多线程的形式运行,并且我发现有人建议使用backgroundworker),并在完成所有计算后弹出一个带有结果的消息框。我在其他例子上复制和编辑了一些代码,但我不知道应该在代码上标记问号。其他的想法也是受欢迎的。VB.net Backgroundworker传递参数和返回值

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

不能随意添加参数的事件处理程序,发件人和e BackgroundWorker的提供。既然你只有一个变量可以传递,你可以简单地将它传递给RunWorkerAsync,并在CLng(e.Argument)的事件处理程序中再次检索它。 –

回答

-1

而不是使用所有代码添加您自己的后台工作者,试试这个。它使用Parallel.For并在其自己的线程中运行循环内的所有内容。

Parallel.For的结构非常简单,但重要的是要记住表示循环的最后一次迭代的数字是排他性的。

例如在一个规则的循环For I As Integer =0 to 100中,将会在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的代码,只需使用上述