Я хочу запускать больше запросов в то же время в разных потоках. Я использую фоновых работников для решения этой проблемы! Мой вопрос: есть ли лучший способ делегировать элемент пользовательского интерфейса или он правильный, как я это сделал?
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() почти такой же, как и bscan() с различным запросом и другим datagridview. Есть ли более эффективный способ сделать это, или это нормально?
Решение BackgroundWorker
не обязательно плохое, но есть новые и улучшенные способы обработки асинхронного программирования на С#. Настоятельно рекомендуется, чтобы вы async
и await
. Это может неприменимо к тому, что вы пытаетесь сделать в этом случае, так как вам не кажется, что вы хотите дождаться завершения одного из методов, поэтому он также рекомендовал вам изучить параллельную библиотеку задач (TPL) и особенно Task.Run()
. Там даже что-то называется Parallel LINQ, которое специально предназначено для обработки асинхронных запросов.