我想在不同的线程中同时运行更多查询。我正在使用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()几乎相同。有没有更有效的方法来做到这一点,还是没问题?
你的BackgroundWorker
解决方案不一定是坏的,但有一些新的和改进的方法来处理C#中的异步编程。强烈建议您查看async
and await
。这可能不会直接适用于你在这种情况下想要完成的事情,因为你似乎不想等待一个方法完成,所以你也建议你查看Task Parallel Library (TPL),特别是Task.Run()
。甚至还有一种名为Parallel LINQ的东西,专门用于处理异步查询。