我想获取教授这种特定类型的老师的列表:
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,仅在数据库操作完成时返回。 (有关更详细的描述,请参阅 this question and its top answer。)MySQL bug #70111在 MySQL 连接器中报告此问题。
要获得真正的异步数据库操作,您必须等到该错误被修复,或者切换到不同的连接器。
我一直在开发一个新的、完全异步的连接器(MySqlConnector on NuGet;source on GitHub)。自 version 0.33.0 起支持 MySqlDataAdapter
.
关于C# mysql executenonqueryasync 不是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47016581/