Поддерживают ли методы соединения MySql асинхронное программирование? - PullRequest
0 голосов
/ 28 мая 2018

Я использую простой метод для подключения к базе данных MySql, но подключение к этой базе данных занимает некоторое время, и это приводит к тому, что приложение находится в режиме «не отвечает».Теперь я могу использовать Async для решения этой проблемы?

Сценарий:

Private void button_clicked()
{
MysqlConnection connection = new MysqlConnection(constring);
connection.open();
}

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

MySQL Connector / NET (то есть MySql.Data) предоставляет асинхронные методы ADO.NET, например, MySqlConnection.OpenAsync, MySqlCommand.ExecuteNonQueryAsync, но все эти методы выполняются синхронно.Это давняя ошибка в Connector / NET.

Вы можете получить асинхронные операции с базой данных, переключившись на MySqlConnector ( NuGet , GitHub ),альтернатива OSS, которая обеспечивает асинхронный ввод-вывод и более высокую производительность.

0 голосов
/ 31 мая 2018

В конце я нашел точный ответ в соответствии с ответом @ MikaalAnwar!

Нам не нужно добавлять какие-либо новые параметры (например, Asynchronous Processing=true) в строку подключения;Это для соединений SQL и не работает для MySql.

Итак, что нам теперь делать?

мы делаем любую пустоту, которая, как предполагается, имеет асинхронную опцию, async.Затем мы добавляем задачу ожидания и запускаем ее (Task.Run).внутри этой задачи мы делаем то, что хотим с нашим соединением.

, например: (Мы не хотим использовать какие-либо наборы данных)

private async void DBConnect() 
{
   awiat Task.Run(() => 
   MySqlConnection DBConnetion = new MySqlConnection(ConString);
   DBConnection.Open();
});

&Мы не используем DBConnection.OpenAsync(), потому что пустота асинхронна, и мы использовали ожидание для задачи.

Закончено:)

0 голосов
/ 28 мая 2018

Я уверен, что это возможно.В дополнение к структурированию вашего кода, как показано ниже ( source ):

public Task<DataSet> GetDataSetAsync(string sConnectionString, string sSQL, params SqlParameter[] parameters)
{
    return Task.Run(() =>
    {
        using (var newConnection = new SqlConnection(sConnectionString))
        using (var mySQLAdapter = new SqlDataAdapter(sSQL, newConnection))
        {
            mySQLAdapter.SelectCommand.CommandType = CommandType.Text;
            if (parameters != null) mySQLAdapter.SelectCommand.Parameters.AddRange(parameters);

            DataSet myDataSet = new DataSet();
            mySQLAdapter.Fill(myDataSet);
            return myDataSet;
        }
    });
}

В сочетании с использованием ключевого слова «await» вы получите нужные вам результаты.

//Use Async method to get data
DataSet results = await GetDataSetAsync(sConnectionString, sSQL, sqlParams);

Также обновите строку подключения, добавив свойство подключения « Асинхронная обработка = true » ( source )

Я также рекомендовал бы иметьпосмотрите на метод « OpenAsync ».Вы можете прочитать больше об этом в документах .

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