Как запустить два или более SQL-запроса одновременно?

0

Я хочу запускать больше запросов в то же время в разных потоках. Я использую фоновых работников для решения этой проблемы! Мой вопрос: есть ли лучший способ делегировать элемент пользовательского интерфейса или он правильный, как я это сделал?

    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. Есть ли более эффективный способ сделать это, или это нормально?

Теги:
delegates
parallel-processing
backgroundworker

1 ответ

0
Лучший ответ

Решение BackgroundWorker не обязательно плохое, но есть новые и улучшенные способы обработки асинхронного программирования на С#. Настоятельно рекомендуется, чтобы вы async и await. Это может неприменимо к тому, что вы пытаетесь сделать в этом случае, так как вам не кажется, что вы хотите дождаться завершения одного из методов, поэтому он также рекомендовал вам изучить параллельную библиотеку задач (TPL) и особенно Task.Run(). Там даже что-то называется Parallel LINQ, которое специально предназначено для обработки асинхронных запросов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню