2010-09-03 4 views
-1

как сохранить переднюю нить вместе с фоновым потоком. если я пытаюсь добавить элементы в список в do work, это дает мне исключение перекрестного потока.BackGroundWorker

+2

В этом вопросе укажите более подробную информацию. Можно определить, что вы просите, но это сложно. –

+0

По списку вы имеете в виду объект коллекции 'System.Collections.Generic.List '? –

ответ

8

В общем, обновления пользовательского интерфейса могут выполняться только из самой пользовательской строки.

Механизм для этого с BackgroundWorker должен вызвать метод рабочего ReportProgress (обязательно WorkerReportsProgress = true). Этот метод вызовет событие ProgressChanged, которое будет обрабатываться потоком пользовательского интерфейса.

Так что если вы хотите, чтобы добавить элементы в ListBox управления, например, на основе какой-то работы, ваша BackgroundWorker делает, вызовите ReportProgress и передать все данные, вам необходимо в качестве параметра. Эти данные будут сохранены в свойстве UserStateProgressChangedEventArgs, предоставленном событием. Ваш обработчик событий может взять эти данные и заполнить его ListBox.

Альтернативно, вы можете добавить все в конце, обработав событие рабочего. Если работа, выполняемая вашим работником, длится не так долго, это часто предпочтительнее, так как она проще, и она меньше ограничивает интерфейс (с меньшим количеством дискретных обновлений для выполнения).

0

Если вы хотите добавить элемент в список в DoWork-Event, вам необходимо «вызвать» элементы управления.

Look here for more details.

+1

На самом деле это не рекомендуется. –

0

Вы можете запустить событие, которое выполняет работу по добавлению элементов в список, как показано в следующем примере, используя ListView.

ListViewItem _listViewItem; 

private void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e) 
{ 
    //your loop to get list view item 
    _listViewItem = new ListViewItem(mytext) {tag = mytagobject); 
    _listViewItem.SubItems.Add(mysubitemtext); 
    Invoke(new EventHandler(UpdateUiEvent), new[] { sender, e }); 
} 

void UpdateUiEvent(object sender, EventArgs e) 
{ 
    listView1.Items.Add(_listViewItem); 
} 
Смежные вопросы