背景工人实施

这是我的后台工作DoWorfunction,是考虑到GUI操作完成的实现好吗?

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { 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.Invoke((MethodInvoker)delegate { comboBox2.Items.Add(scode); }); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } 

这是调用它的函数:

  private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) { if(comboBox4.SelectedIndex == 0) { backgroundWorker1.RunWorkerAsync(); } else { MessageBox.Show("This table doesn't exist within the database"); } } 

目前没有任何反应..代码只是在屏幕上以默认forms运行。 没有加载值,我做错了什么?

BGW已经过时了。 TPL, async/awaitIProgress可以解决使用BGW的所有情况以及更多情况。

在这种情况下,BGW无论如何都不合适。 真正的延迟是由数据库调用引起的,而不是加载UI。 要异步执行数据库调用,只需使用异步事件处理程序:

 private async void comboBox4_SelectedIndexChanged(object sender, EventArgs e) { var conString=Properties.Settings.Default.MyConnectionString; string query = "SELECT * FROM dbo.Liguanea_Lane2"; using(var con = new SqlConnection(conString)) using(var cmd = new SqlCommand(query, con)) { await con.OpenAsync(); var reader=await cmd.ExecuteReader(); while (dr.Read()) { string scode = dr.GetString(dr.GetOrdinal("code")); comboBox2.Items.Add(scode); } } } 

有更好的方法来加载组合。 一个改进是加载列表中的所有项目,然后使用AddRange更新组合。 AddRange已经调用BeginUpdate以防止在从列表中添加项目时更新UI。

  var items=new List(); using(var con = new SqlConnection(conString)) using(var cmd = new SqlCommand(query, con)) { await con.OpenAsync(); var reader=await cmd.ExecuteReader(); while (dr.Read()) { string scode = dr.GetString(dr.GetOrdinal("code")); list.Add(scode); } } comboBox2.Items.AddRange(items); 

更好的是,使用像Dapper这样的微型ORM来摆脱所有这些代码:

 using(var con = new SqlConnection(conString)) { await con.OpenAsync(); var items=await con.QueryAsync(query); comboBox2.Items.AddRange(items); }