如何同时运行两个或多个sql查询?

时间:2017-12-21 17:09:57

标签: c# mysql parallel-processing delegates backgroundworker

我想在不同的线程中同时运行更多查询。我正在使用backgroundworkers来解决这个问题!我的问题是:是否有更好的方式委托UI元素,或者它是否正确,因为我这样做了?

    private void mainform_Load(object sender, EventArgs e)
    {


        if (bscan_backgroundworker.IsBusy == false)
        {
            bscan_backgroundworker.RunWorkerAsync();
        }

    if (bscan2_backgroundworker.IsBusy == false)
        {
            bscan2_backgroundworker.RunWorkerAsync();
        }

    }

    private void bscan_backgroundworker_DoWork(object sender, DoWorkEventArgs e)
    {
        bscan();

    }

    private void bscan2_backgroundworker_DoWork(object sender, DoWorkEventArgs e)
    {
        bscan2();

    }

    private void bscan()
    {  

     string query = "Select * from table_name";
     MySqlConnection mysqlconn_to_db = new MySqlConnection(connectionstring);
        try
        {
            mysqlconn_to_db.Open();
            using (MySqlCommand command = new MySqlCommand(query, mysqlconn_to_db))
            {
                command.ExecuteNonQuery();

                using (MySqlDataAdapter adapter = new MySqlDataAdapter(command))
                {
                    DataTable datatable = new DataTable();
                    adapter.Fill(datatable);


                    if (this.InvokeRequired)
                    {
                        this.Invoke(new MethodInvoker(delegate ()
                        {
                            dataGridView1.DataSource = datatable;
                            dataGridView1.Refresh();
                            label2.Text = dataGridView1.Rows[Convert.ToInt16(label1.Text)].Cells[0].Value.ToString();
                        }));
                    }
                    else
                    {
                        dataGridView1.DataSource = datatable;
                        dataGridView1.Refresh();                           
                        label2.Text = dataGridView1.Rows[Convert.ToInt16(label1.Text)].Cells[0].Value.ToString();
                    }


                adapter.Dispose();
                }

            }
        }
        catch (Exception ex)
        {
            messagebox(ex.Message);
        }


    }

bscan2()方法与具有不同查询和不同datagridview的bscan()几乎相同。有没有更有效的方法来做到这一点,还是没问题?

1 个答案:

答案 0 :(得分:0)

您的BackgroundWorker解决方案不一定是坏的,但有一些新的和改进的方法来处理C#中的异步编程。强烈建议您查看async and await。这可能不适用于你在这种情况下想要完成的事情,因为你似乎不想等待一个方法完成,因此建议你调查Task Parallel Library (TPL),特别是Task.Run()。甚至还有一些名为Parallel LINQ的东西专门用于处理异步查询。