VB.NET WinForms - Как получить доступ к объектам основного потока из потока BackgroundWorker? - PullRequest
3 голосов
/ 04 августа 2011

Я работаю с BackgroundWorker, я хочу, чтобы BackgroundWorker выполнял процесс извлечения данных из базы данных, пока пользователь все еще может выполнять другую задачу в форме. Проблема в том, что после извлечения данных у меня не получается получить доступ к ListView в моем Form из события DoWork BackgroundWorker, я буду заполнять этот ListView, используя полученные данные. Что я должен делать? Я что-то упустил?

Рассмотрим этот пример, вот как я это делаю:

Public Class Test
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Label1.Text = "Hello World"
    End Sub
End Class

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Документация для BackgroundWorker совершенно ясна:

Вы должны быть осторожны, чтобы не манипулировать объектами пользовательского интерфейса в обработчике событий DoWork .Вместо этого обменивайтесь данными с пользовательским интерфейсом через события ProgressChanged и RunWorkerCompleted .


Пример "Как выполнить: загрузить файлна заднем плане " показывает один из примеров того, как объекты могут совместно использоваться основным потоком и фоновым рабочим - путем организации хранения таких объектов в переменных на уровне класса.

0 голосов
/ 11 мая 2014

DoWorkEventArgs содержит свойство Argument, в котором вы можете хранить любой объект, например, определенный пользователем класс, содержащий инструкции для управления пользовательским интерфейсом.

...