VB.net 后台工作者传递参数和返回值



我需要运行一份报告,获取学生测试的摘要,其中显示通过或失败的详细信息。当单击cmd_Start时,它为每个学生在后台工作者上运行(我只想以多线程运行,我发现人们建议使用后台工作者(,并在所有计算完成后弹出一个带有结果的消息框。我复制并编辑了其他示例中的一些代码,但我不知道我应该在我标记问号的代码上放什么。其他想法也欢迎。

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

与其使用所有这些代码添加您自己的后台工作线程,不如尝试一下。它使用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 代码,只使用上面的代码

最新更新