Я пытаюсь познакомиться с асинхронным/ждущим. Поэтому я пытаюсь написать программу C#/WPF для асинхронного запроса базы данных без блокировки моего графического интерфейса.async функция блокирует мое приложение wpf
Я создал объект, реализующий интерфейс INotifyPropertyChanged
. Этот объект предлагает свойство DataTable
, и это должно измениться функцией async. Мой компонент 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");
}
Это прекрасно работает с одним исключением: нажатие кнопки блокирует мой графический интерфейс пользователя, пока данные не и я не понимаю, почему.
Может кто-нибудь, пожалуйста, объясните мне свою неудачу? Я не понимаю, почему асинхронная функция не будет выполняться асинхронно?
С уважением
Спасибо, что сделал трюк. А также благодарю вас за намек на мои одноразовые предметы. Я сделаю лучше. – Mike