关于后台工作者的一些澄清

本文关键字:工作者 于后台 后台 | 更新日期: 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更安全。

查看谷歌关于如何安全跨线程操作的文章