正在阅读后台工作者,主要是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方法中调用我的整体上面的函数?
答案 0 :(得分:0)
如果您使用.Net 4.5或更高版本支持async / await,则后台工作程序基本上已过时。所以如果你要学习新东西,我建议你学习。
如果您仍然要使用backgroundworker,您可以在ProgressChanged
循环中引发while
事件,并在该事件处理程序的实现中进行组合框操作,以便您可以访问UI线程
修改
由于你没有理由在你去的时候更新组合框,我会选择Hans'建议。
答案 1 :(得分:0)
基本思想是你不能从当前后台工作线程(doWork函数)进行任何gui调用或更改,原因很简单,它不是那个线程而是创建图形对象的主线程。 (你不能修改在不同线程下实例化的对象)
这就是为什么后台工作者类支持更改或完成进度等方法的原因,您可以在其中修改UI。
注意调用,使用invoke_required更安全。
查看谷歌有关如何进行安全交叉线程操作的文章