我正在使用后台线程来运行密集的搜索过程,以便允许完全访问UI。创建每个bgw后,我更新了一个datagridview,它显示了不同的线程和当前状态。但是一旦完成,我就没办法或者至少我不知道如何更新每个backgroundworker特定的datagridview上的状态。
Try
bgw.RunWorkerAsync()
queuelist.Enqueue(bgw)
If Not Thread.CurrentThread.Name = "Main Thread" Then
Dim record As String() = {jobNum, clientProj & jobNum, jobStartTime, bgw.IsBusy.ToString}
DataGridView1.Rows.Add(record)
End If
Catch ex As Exception
MessageBox.Show("An Error Occured:" & vbNewLine & ex.Message)
End Try
这会在线程开始时设置datagridviewer,但一旦结束,我就不知道如何更新或知道哪个线程结束了。我尝试将它们放入队列中,但是当我出队时我无法识别出特定的工人。
任何想法
答案 0 :(得分:1)
我真的不明白为什么你会在用户界面上看到后台工作人员等实现细节。好吧,一些代码。使用队列没有意义,线程不会以任何可预测的顺序结束。我们来做一个清单:
Dim workerList As New List(Of BackgroundWorker)
您希望利用BGW引发的RunWorkerCompleted事件来了解作业何时完成。所以使用AddHandler:
Dim bgw As New BackgroundWorker
AddHandler bgw, AddressOf DoSomeWork
AddHandler bgw, AddressOf WorkDone
workerList.Add(bgw)
'' Do something with the grid
''...
bgw.RunWorkerAsync()
事件处理程序可能如下所示:
Private Sub WorkDone(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
If e.Error IsNot Nothing Then Throw e.Error
Dim bgw = DirectCast(sender, BackgroundWorker)
workerList.Remove(bgw)
'' Do something with the grid
End Sub