C#Mysql executtenonqueryasync不是异步的

我想获得教授这种特定类型的教师名单:

public static async Task getTeacherSHS() { DataTable dt = new DataTable(); string query = @"some long query dont mid this"; using (MySqlConnection conn = new MySqlConnection(cs)) { try { await conn.OpenAsync(); using( MySqlCommand cmd = new MySqlCommand(query,conn)) { cmd.Parameters.AddWithValue("@shs", "%SHS%"); cmd.Parameters.AddWithValue("@term", term); await cmd.ExecuteNonQueryAsync(); using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) { await da.FillAsync(dt); MySqlCommandBuilder cb = new MySqlCommandBuilder(da); } } } catch (MySqlException e) { Console.Write(e.Message); } if (conn != null) await conn.CloseAsync(); } return dt; } 

现在我的获取方法是通过单击按钮,它将返回我的datagridview的数据表

 private async void button1_Click_1(object sender, EventArgs e) { dataGridView1.DataSource = await ConnectionAsync.getTeacherSHS(); dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } 

我的问题是,单击按钮后,调用阻止其他I / O我似乎无法键入其他文本框,因为它正在等待任务完成。 我认为这是异步的,有人可以解释一下吗?

发生这种情况是因为MySql.Data连接器中的Async方法实际上并不是异步的。 它们阻塞网络I / O,仅在DB操作完成时返回。 (有关更详细的说明,请参阅此问题及其最佳答案 。) MySQL错误#70111在MySQL连接器中报告此问题。

要获得真正的异步数据库操作,您必须等到修复该错误,或​​切换到其他连接器。

我一直在开发一个新的完全异步连接器( NuGet 上的 MySqlConnector ; GitHub上的源代码 ); 遗憾的是,它还不支持DataTable ,因此除非您可以重写代码以不再使用MySqlDataAdapter否则它无法解决此特定问题。