Запросить несколько экземпляров MySQL с помощью Asyn c - сегментированной среды - PullRequest
1 голос
/ 16 июня 2020

Я создаю инструмент с использованием MVC для выполнения запросов к сегментированной среде MySQL. Текущий инструмент работает, позволяя пользователю вводить запрос, выбирать свою базу данных, а затем выбирать экземпляры. Таким образом, из этого я могу построить строки подключения и добавить их в список и передать их методу в моем классе запроса db. Это отлично работает, но будет медленным, так как это синхронно.

Как я могу превратить мой синхронный foreach l oop в асинхронный метод?

Ниже приведен мой текущий метод получения данных с серверов:

public DataSet getResults(List<string> connstrings, string query)
{
    foreach (string con in connstrings)
    {
        DataSet masterDS = new DataSet();

        MySqlConnection conn = new MySqlConnection(con);
        try
        {
            conn.Open();
            MySqlCommand cmd = new MySqlCommand(query, conn);
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);                    
            masterDS.Merge(ds);           

        }
        catch (MySqlException ex)
        {
            int errorcode = ex.Number;

        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
        finally
        {
            conn.Close();
        }           
    }

    Return MasterDS;
}

Также , вместо сохранения результатов в памяти я буду записывать их в файл на сервере.

1 Ответ

0 голосов
/ 16 июня 2020

Честно говоря, не знаю, понравится ли DataSet это, если это потокобезопасно. Но это единственное, что вы можете сделать с задачами, связанными с процессором:

public DataSet getResults(List<string> connstrings, string query)
{
    var tasks = new List<Task>();
    DataSet masterDS = new DataSet();

    foreach (string con in connstrings)
    {

        tasks.Add(Task.Run(() = 
        {
            MySqlConnection conn = new MySqlConnection(con);
            try
            {
                conn.Open();
                MySqlCommand cmd = new MySqlCommand(query, conn);
                MySqlDataAdapter da = new MySqlDataAdapter(cmd);
                // NOTE changes here
                da.Fill(masterDS);                    

            }
            catch (MySqlException ex)
            {
                int errorcode = ex.Number;

            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
            }
            finally
            {
                conn.Close();
            }   
        });     
    }

    Task.WaitAll(tasks.ToArray());

    Return MasterDS;
}

Возможно, вам может потребоваться возврат go к Merge. Только делайте это после того, как все задачи выполнены. Если вы хотите быть действительно изощренным, вы можете вызвать Task.ContinueWith, где вы добавляете каждую DS в параллельную очередь, а затем иметь другую Task.Run..., которая берет из этой очереди и объединяет DS в одном потоке, пока DS все еще заполняются. Итак, к моменту завершения Task.WaitAll у вас все будет готово

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...