具有返回值的多线程:vb.net

2 vb.net multithreading

我创建了一个列表,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)

所以问题是我无法从被调用的函数访问返回值。谁能建议我一些实现这一目标的方法?

提前致谢

Dar*_*ryl 5

我认为,最简单的方法是使用名为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文档)。