对背景工作者的一些澄清

时间:2016-11-07 15:59:33

标签: c# winforms backgroundworker

正在阅读后台工作者,主要是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方法中调用我的整体上面的函数?

2 个答案:

答案 0 :(得分:0)

如果您使用.Net 4.5或更高版本支持async / await,则后台工作程序基本上已过时。所以如果你要学习新东西,我建议你学习。

如果您仍然要使用backgroundworker,您可以在ProgressChanged循环中引发while事件,并在该事件处理程序的实现中进行组合框操作,以便您可以访问UI线程

  

修改

由于你没有理由在你去的时候更新组合框,我会选择Hans'建议。

答案 1 :(得分:0)

基本思想是你不能从当前后台工作线程(doWork函数)进行任何gui调用或更改,原因很简单,它不是那个线程而是创建图形对象的主线程。 (你不能修改在不同线程下实例化的对象)

这就是为什么后台工作者类支持更改或完成进度等方法的原因,您可以在其中修改UI。

注意调用,使用invoke_required更安全。

查看谷歌有关如何进行安全交叉线程操作的文章