我创建了一个列表,threads以实现Multi Threading全部接受一个返回值的函数。以下是我尝试过的代码:
创建线程
Dim txt as String
For i As Integer = 0 To 15
txt = ""
txt = UCase(array.Item(i))
Dim tempThread As Threading.Thread = New Threading.Thread(AddressOf threadRead)
tempThread .Start(txt) ' start thread by passing value to it
Threads.Add(tempThread ) 'Add thread to the list
'Here i want to add the return value from the thread to RichTextbox
'as follows
RichTextBox1.Text = RichTextBox1.Text & vbNewLine & tempThread.ReturnValue
Next
Run Code Online (Sandbox Code Playgroud)
线程处理的功能
Public Function threadRead(ByVal txtInput As String) As String
Dim stroutput As String = ""
' Some operations are performed here
Return stroutput
End Function
Run Code Online (Sandbox Code Playgroud)
所以问题是我无法从被调用的函数访问返回值。谁能建议我一些实现这一目标的方法?
提前致谢
我认为,最简单的方法是使用名为a的辅助对象BackgroundWorker。您可以在此处找到MSDN文档。
以下是使用方法的示例:
Private Sub RunFifteenThreads()
For i As Integer = 1 To 15
Dim some_data As Integer = i
Dim worker As New System.ComponentModel.BackgroundWorker
AddHandler worker.DoWork, AddressOf RunOneThread
AddHandler worker.RunWorkerCompleted, AddressOf HandleThreadCompletion
worker.RunWorkerAsync(some_data)
Next
End Sub
Private Sub RunOneThread(ByVal sender As System.Object, _
ByVal e As System.ComponentModel.DoWorkEventArgs)
Dim stroutput As String = e.Argument.ToString
' Do whatever else the thread needs to do here...
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
RichTextBox1.Text = RichTextBox1.Text & vbNewLine & return_value
End Sub
Run Code Online (Sandbox Code Playgroud)
每个辅助对象都管理自己的线程。调用工作程序的RunWorkerAsync方法将创建一个新线程,然后引发一个DoWork事件。处理该DoWork事件的函数在工作程序创建的线程中执行。该功能完成后,工作人员将引发一个RunWorkerCompleted事件。处理该RunWorkerCompleted事件的函数在原始线程(称为)中执行RunWorkerAsync。
要在线程之间传递数据,请e在事件处理程序中使用EventArgs参数(在上面的示例中)。您可以将单个参数传递给RunWorkerAsync,通过可以将其提供给新线程e.Argument。要从工作线程向主线程发送另一个方向的数据,您可以e.Result在工作线程中设置的值,然后将该值传递给处理线程完成的函数(也称为)e.Result。
您还可以在工作线程仍在执行时,使用ReportProgress和在线程之间发送数据ProgressChanged(如果有兴趣,请参见MSDN文档)。