2010-09-03 55 views
-1

如何維護一個前臺線程和後臺線程。如果我嘗試將項目添加到列表中,它會給我一個交叉線程異常。BackGroundWorker

+2

請給這個問題的更多信息。可以確定你在問什麼,但是很難。 – 2010-09-03 07:10:11

+0

按列表您是指集合對象'System.Collections.Generic.List '? – 2010-09-03 07:13:01

回答

8

通常,UI更新只能從UI線程本身執行。

BackgroundWorker這樣做的機制是調用工作人員的ReportProgress方法(確保WorkerReportsProgress = true)。此方法將引發ProgressChanged事件,由UI線程處理。

所以,如果你想將項目添加到一個ListBox控制,例如,基於一些工作你BackgroundWorker是幹什麼的,叫ReportProgress並通過你需要作爲一個參數的任何數據。該數據將存儲在該事件提供的ProgressChangedEventArgsUserState屬性中。您的事件處理程序可以獲取此數據並使用它填充ListBox

或者,您可以通過處理工作人員的RunWorkerCompleted事件來添加所有內容。如果您的工作人員執行的工作不需要很長時間,那麼這通常更可取,因爲它更簡單,並且強調用戶界面更少(用更少的離散更新來執行)。

0

如果您想將項目添加到DoWork-Event的列表中,您需要「調用」控件。

Look here for more details

+1

這不是真正推薦的方法。 – 2010-09-03 07:20:08

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); 
}