await ExecuteNonQueryAsync() 仍然阻塞我的 UI
await ExecuteNonQueryAsync() still blocks my UI
我发现我的 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 完成。有什么想法吗?
每 the documentation 对于 OdbcCommand.ExecuteNonQueryAsync
:
Providers should override with an appropriate implementation. The cancellation token may optionally be ignored. The default implementation invokes the synchronous ExecuteNonQuery method and returns a completed task, blocking the calling thread.
派生命令(例如 SQL 服务器的 SqlCommand
)do 重写此命令以便命令异步执行。
如果要避免阻塞 UI 线程,则必须在线程池线程上执行此操作:
var results = await Task.Run(() => ntz.getProductNames());
鉴于未实现异步方法并简单地委托给它们的同步等效方法,更改 getProductNames
以首先使用同步方法可能是有意义的。
尝试添加这个,而不是 await ntz.OpenAsync();.
await Task.StartNew(ntz.Open);
我发现我的 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 完成。有什么想法吗?
每 the documentation 对于 OdbcCommand.ExecuteNonQueryAsync
:
Providers should override with an appropriate implementation. The cancellation token may optionally be ignored. The default implementation invokes the synchronous ExecuteNonQuery method and returns a completed task, blocking the calling thread.
派生命令(例如 SQL 服务器的 SqlCommand
)do 重写此命令以便命令异步执行。
如果要避免阻塞 UI 线程,则必须在线程池线程上执行此操作:
var results = await Task.Run(() => ntz.getProductNames());
鉴于未实现异步方法并简单地委托给它们的同步等效方法,更改 getProductNames
以首先使用同步方法可能是有意义的。
尝试添加这个,而不是 await ntz.OpenAsync();.
await Task.StartNew(ntz.Open);