等待ExecuteNonQueryAsync()仍然阻止我的UI

Ale*_*vid 2 c# sql asynchronous netezza

我发现在调用异步方法时我的C#app 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();
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序完全挂起(UI无响应),直到cmd.ExecuteNonQueryAsync完成.有任何想法吗?

Cha*_*ger 8

文档OdbcCommand.ExecuteNonQueryAsync:

提供商应该覆盖适当的实施.可以可选地忽略取消令牌.默认实现调用同步ExecuteNonQuery方法并返回已完成的任务,阻止调用线程.

派生命令(例如SqlCommand对于SQL Server)覆盖此命令,因此命令将异步执行.

如果你想避免阻塞UI线程,那么你必须在线程池线程上执行它:

var results = await Task.Run(() => ntz.getProductNames());
Run Code Online (Sandbox Code Playgroud)

鉴于异步方法没有实现并且只是委托给它们的同步等价物,因此首先改变getProductNames使用同步方法可能是有意义的.