关于后台工作者的一些澄清
本文关键字:工作者 于后台 后台 | 更新日期: 2023-09-27 18:16:58
一直在阅读后台worker,主要是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"的组合框。我的问题是,这是否意味着我不能在doWork方法中调用我的整体上述函数,只是因为这个comboBox控制器?
如果你使用的是。net 4.5或更高版本而支持async/await,那么Backgroundworker基本上已经过时了。所以,如果你想学点新东西,我建议你学那个。
如果你仍然要使用backgroundworker,你会在你的while
循环中引发ProgressChanged
事件,并在该事件处理程序的实现中进行组合框操作,这样你就可以访问UI线程。
编辑
既然没有必要随时更新组合框,我还是采纳Hans的建议。
的基本思想是,你不能从当前后台工作线程(doWork函数)进行任何gui调用或更改,原因很简单,它不是线程,而是主线程创建图形对象。(你不能修改在不同线程下实例化的对象)
这就是为什么后台worker类支持诸如progress changed或completed这样的方法,在这些方法中你可以修改UI。
要小心调用,使用invoke_required更安全。
查看谷歌关于如何安全跨线程操作的文章