C#Mysql executeonqueryasync不是异步的
本文关键字:异步 executeonqueryasync C#Mysql | 更新日期: 2023-09-27 18:15:16
我想获得教授这种特定类型的教师的列表:
public static async Task<DataTable> 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 bug#70111报告了MySQL连接器中的此问题。
要获得真正的异步DB操作,您必须等到该错误得到修复,或者切换到不同的连接器。
我一直在开发一个新的、完全异步的连接器(NuGet上的MySqlConnector;GitHub上的source(。自0.33.0版本起,它支持MySqlDataAdapter
。