2016-11-07 32 views
0

一直在讀取後臺工作人員,主要是doWork方法。它表示這應該有計算,但不應該依賴於GUI代碼。這是我的功能:關於後臺工作人員的一些說明

void fillLiguanea() 
{ 
    // this.liguanea_LaneTableAdapter1.Fill(this.pharmaciesDataSet1.Liguanea_Lane); 
    try 
    { 
     string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
     SqlConnection con = new SqlConnection(connectionString); 
     con.Open(); 
     string query = "SELECT * FROM dbo.Liguanea_Lane2"; 
     SqlCommand cmd = new SqlCommand(query, con); 

     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     { 
      string scode = dr.GetString(dr.GetOrdinal("code")); 
      comboBox2.Items.Add(scode); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

在上面的函數中有一個名爲「comboBox2」的組合框。我的問題是,這是否意味着我不能僅僅因爲這個comboBox控制器就在doWork方法中調用我的整體上面的函數呢?

+1

填寫了'名單'並將其分配給e.Result。然後,您的RunWorkerCompleted事件處理程序可以更新組合框。 –

+0

Stack Overflow已經有很多關於如何與來自另一個線程的UI對象交互的問題和解答,包括'BackgroundWorker'使用的工作線程。看到一個這樣的例子標記爲重複。如果您發現自己仍然有困難,在閱讀了大量可用信息後,發佈一個新問題,其中包含一個很好的[mcve],可以清楚地顯示您嘗試過的內容,並詳細說明您已完成的研究和具體而言,你仍然無法理解。 –

回答

0

如果您使用.Net 4.5或更高版本支持async/await,Backgroundworker基本已過時。所以如果你要學習新東西,我建議你學習。

如果你仍然要使用BackgroundWorker的,您會在while循環中提高ProgressChanged事件,做你組合框的操作在事件處理程序的實現,所以你可以訪問到UI線程。

編輯

由於實在沒有理由更新組合框,你走了,我會採取漢斯的意見。

0

基本思想是你不能對當前後臺工作線程(doWork函數)進行任何gui調用或更改,原因很簡單,它不是線程而是創建圖形對象的主線程。 (不能修改在不同線程下實例化的對象)

這就是爲什麼後臺工作者類支持諸如改變或完成進度的方法,您可以在其中修改UI。

雖然要小心調用,但使用invoke_required會更安全。

檢查谷歌的文章,就如何使安全的跨線程操作