Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wait ExecuteNonQueryAsync()仍会阻止我的UI_C#_Sql_Asynchronous_Netezza - Fatal编程技术网

C# wait ExecuteNonQueryAsync()仍会阻止我的UI

C# wait ExecuteNonQueryAsync()仍会阻止我的UI,c#,sql,asynchronous,netezza,C#,Sql,Asynchronous,Netezza,我发现我的C应用程序UI在调用异步方法时挂起,我不知道为什么 private async void selectCSVFileButton_Click(object sender, EventArgs e) { ... var results = await ntz.getProductNames(); ... } ... public async Task<List<string[]>> getProductNames() { stri

我发现我的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();
    ...
}
我的应用程序完全挂起,直到cmd.ExecuteNonQueryAsync完成。有什么想法吗?

Per for OdbcCommand.ExecuteNonQueryAsync:

提供程序应使用适当的实现重写。可以选择性地忽略取消令牌。默认实现调用同步ExecuteOnQuery方法并返回已完成的任务,从而阻塞调用线程

派生命令(如SQLServer的SqlCommand)会覆盖此命令,以便该命令异步执行

如果要避免阻塞UI线程,则必须在线程池线程上执行此操作:

var results = await Task.Run(() => ntz.getProductNames());
由于异步方法没有实现,只是简单地委托给它们的同步等价物,因此首先更改getProductNames以使用同步方法可能是有意义的。

尝试添加此方法,而不是等待ntz.OpenAsync


非常感谢查尔斯,我完全错过了!你是说Task.Run还是Task.Factory.StartNew?
await Task.StartNew(ntz.Open);