await ExecuteNonQueryAsync()仍然阻塞我的UI
本文关键字:我的 UI ExecuteNonQueryAsync await | 更新日期: 2023-09-27 18:02:53
我发现我的c#应用程序UI在调用异步方法时挂起,我不知道为什么。
private async void selectCSVFileButton_Click(object sender, EventArgs e)
{
...
var results = await ntz.getProductNames();
...
}
...
public async Task<List<string[]>> getProductNames()
{
string fmt = "DRIVER={{NetezzaSQL}};SERVER={0};PORT={1};DATABASE={2};UID={3};PWD={4};";
ntz = new OdbcConnection(string.Format(fmt, server, port, db, user, password));
await ntz.OpenAsync();
qry = "SELECT * FROM ak_db_1 WHERE prod_name_desc='Unknown'";
OdbcCommand cmd = ntz.CreateCommand();
cmd.CommandTimeout = 600;
cmd.CommandText = qry;
await cmd.ExecuteNonQueryAsync();
...
}
我的应用程序完全挂起(UI无响应),直到cmd。ExecuteNonQueryAsync完成。什么好主意吗?
根据OdbcCommand.ExecuteNonQueryAsync
的文档:
提供者应该用适当的实现覆盖。可以选择忽略取消令牌。默认实现调用同步ExecuteNonQuery方法并返回一个已完成的任务,阻塞调用线程。
派生命令(如SQL Server的SqlCommand
) 做重写这个,所以命令异步执行。
如果你想避免阻塞UI线程,那么你必须在线程池线程上执行这个:
var results = await Task.Run(() => ntz.getProductNames());
如果异步方法没有实现,只是简单地委托给它们的同步等效方法,那么将getProductNames
更改为首先使用同步方法可能是有意义的。
尝试添加这个,而不是await ntz.OpenAsync();.
await Task.StartNew(ntz.Open);