текущий статус фонового рабочего - PullRequest
0 голосов
/ 13 октября 2010

Я использую фоновые потоки для запуска интенсивных процессов поиска, чтобы пользовательский интерфейс был полностью доступен.После создания каждого BGW я обновляю сетку данных, которая показывает различные темы и текущее состояние.однако, как только они завершатся, у меня не будет способа или, по крайней мере, я не знаю, как обновить статус в сетке данных, характерной для каждого работника, работающего в фоновом режиме.

 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

устанавливает сетку данных после начала потоков, но как только он заканчивается, я не знаю, как обновить или узнать, какой поток завершился.Я пытался поместить их в очередь, но я не могу определить конкретного работника, когда снимаю очередь.

любые идеи

1 Ответ

1 голос
/ 13 октября 2010

Я действительно не понимаю, почему вы делаете детали реализации, такие как фоновые рабочие, видимыми в пользовательском интерфейсе.Ну, немного кода.Использовать очередь не имеет смысла, потоки не заканчиваются в любом предсказуемом порядке.Давайте составим список:

Dim workerList As New List(Of BackgroundWorker)

Вы хотите воспользоваться событием RunWorkerCompleted, вызванным BGW, чтобы узнать, когда задание выполнено.Так что используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...