2014-06-05 61 views
0

我有一個GUI,其中包含主窗體上的列表框中的測試腳本列表。我希望BackgroundWorker根據從列表框中選擇的項目執行不同的腳本。有條件的BackgroundWorker場景

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    if(listbox.SelectedItem.ToString() == test1) 
    { 
     testcase test1 = new testcase(); // instantiate the script 
     test1.script1(); // run the code 
    } 
} 

然而,當我嘗試這樣做,我得到的消息InvalidOperationException occurred因爲我嘗試進行跨線程操作。是否有另一種方式來完成這項任務?

回答

2

在調用您的後臺工作程序之前將數據傳遞給後臺線程。

bw.RunWorkerAsync(listbox.SelectedItem.ToString()); 
... 
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string selectedItem = (string)e.Argument; 

    if(selectedItem == test) 
    { 
     testcase test1 = new testcase(); // instantiate the script 
     test1.script1(); // run the code 
    } 

}

2

您正在嘗試從不同線程的UI元素讀取值。 這是不允許的。因此你得到了InvalidOperationException

UI元素由主(UI)線程擁有。

爲了從不同的線程訪問UI元素,你需要調用當前調度:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string selectedItem = ""; 
    this.Dispatcher.Invoke(new Action(() => 
    { 
     selectedItem = listbox.SelectedItem.ToString(); 
    } 

    if(selectedItem == test) 
    { 
     testcase test1 = new testcase(); // instantiate the script 
     test1.script1(); // run the code 
    } 
} 

注意,當你調用調度,同步線程安全地獲得價值跨線程。您不希望在調度程序中調用完整的代碼,因爲它不會在不同的線程上執行

+0

我只能得到'this.Invoke' – Nevets

+1

@nevets你在WPF或的WinForms?兩者的語法略有不同。這個概念是一樣的 – middelpat