C# async/await не работает с mysql
Я пытаюсь разобраться в этой асинхронной / ожидающей вещи и подумал, что попробую сделать это с помощью небольшого приложения для базы данных. Ниже приведен код, который работает нормально, но метод GetData() не работает асинхронно, потому что пользовательский интерфейс все еще зависает при подключении/извлечении данных. У меня есть случайные числа, заполняющие listBox2 в качестве визуального сигнала о том, что пользовательский интерфейс замерзает. База данных-это просто список адресов веб-сайтов, которые я сделал для тестирования этого кода.
using System; using System.Windows.Forms; using MySql.Data.MySqlClient; namespace MySQLasync { public partial class Form1 : Form { // public variables and constants string strconnect = "Server = localhost; Port=3306; Database=mydbase; Uid=myusername; Pwd=mypasswd;"; Random r = new Random(); int c = 0; public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { timer1.Enabled = true; GetData(); } private async void GetData() { listBox1.Items.Clear(); string sql = "SELECT * FROM websites"; MySqlConnection con1 = new MySqlConnection(strconnect); { con1.Open(); MySqlCommand cmd = new MySqlCommand(sql, con1); MySqlDataReader reader = (MySqlDataReader)await cmd.ExecuteReaderAsync(); while (reader.Read()) { listBox1.Items.Add(reader["title"].ToString()); } con1.Close(); } } private void Timer1_Tick(object sender, EventArgs e) { c++; if (c > 20) { c = 0; listBox2.Items.Clear(); } int num = r.Next(1, 999999); listBox2.Items.Add(num); } } }
Что я уже пробовал:
Независимо от того, использую ли я async / await или нет, код работает точно так же. То есть пользовательский интерфейс по-прежнему зависает на то же время, что и доступ к данным и добавление их в listBox1.
Может кто-нибудь объяснить, что я здесь делаю не так? Я хочу, чтобы пользовательский интерфейс оставался отзывчивым во время доступа к данным и их загрузки. Я еще не уверен, что у меня есть вся концепция async/await. Спасибо.
Richard Deeming
Как насчёт:
while (await reader.ReadAsync())
Кроме того, убедитесь, что вы используете MySQL Connector/NET 6.9 или более поздней версии.
MySQL :: MySQL Connector/NET руководство разработчика :: 5.10 асинхронные методы[^]
dragnscalearmor
Ричард, спасибо тебе. Я сделал это изменение, но тот же результат: пользовательский интерфейс немного зависает. Кроме того, я использую 8.0.15 соединителя MySQL.