后台工人实施

时间:2016-11-08 15:42:02

标签: c# winforms backgroundworker

这是我的后台工作DoWor功能,是考虑到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");
        }
    }

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

1 个答案:

答案 0 :(得分:3)

BGW已经过时了。 TPL,<ul> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> <li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li> </ul>async/await可以解决使用BGW的所有情况以及更多情况。

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

IProgress<T>

虽然有更好的方法来加载组合。一个改进是加载列表中的所有项目,然后使用AddRange更新组合。 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); } } } 已调用BeginUpdate以防止在从列表中添加项目时更新UI。

AddRange

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

        var items=new List<string>();
        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);