我正在尝试了解async/await。所以我尝试编写一个C#/WPF程序,异步查询数据库而不会阻塞我的GUI。
我创建了一个实现INotifyPropertyChanged
接口的对象。该对象提供了一个DataTable
属性,这应该由我的异步函数更改。我的GUI组件绑定到DataTable
属性。
我的对象看起来像这样:
public class AsyncDataDemo : INotifyPropertyChanged
{
protected DataTable data = new DataTable();
public DataTable Data
{
get { return data; }
protected set
{
data = value;
doPropertyChanged("Data");
}
}
protected virtual void doPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChangedEventArgs Arguments = new PropertyChangedEventArgs(propertyName);
PropertyChanged(this, Arguments);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected async Task<DataTable> OpenQueryAsync(string ConnectionString, string Query)
{
OdbcConnection connection = new OdbcConnection(ConnectionString);
await connection.OpenAsync().ConfigureAwait(false);
OdbcCommand command = new OdbcCommand(Query, connection);
DbDataReader dataReader = await command.ExecuteReaderAsync().ConfigureAwait(false);
DataTable resultData = new DataTable();
resultData.Load(dataReader);
connection.Close();
return resultData;
}
public async void RunQueryAsync(string Query)
{
Data = await OpenQueryAsync("<ConectionString>", (Query as string)).ConfigureAwait(false);
}
}
在按钮点击事件中,我调用:
private void Button_Click(object sender, RoutedEventArgs e)
{
data.RunQueryAsync("SELECT * FROM BigTable");
}
这个功能基本正常,但有一个例外:按钮点击会阻塞我的GUI,直到数据加载完成,我不明白为什么。
请问有人能给我解释一下吗?我不明白为什么异步函数不能异步运行?
谢谢!
.ConfigureAwait(false)
对代码流程没有影响,即使你设置了.ConfigureAwait(false)
,在await
调用之后仍然会停留在UI线程上。 - Scott Chamberlain