Можно ли ждать асинхронных задач во время нажатия кнопки?
У меня есть кнопка обновления в моем приложении, которая использует некоторые асинхронные методы для обновления списка отображаемых элементов. Проблема в том, что у меня не может быть возвращаемого типа Task для обработчика события для нажатия кнопки, поэтому мне остается метод async void. Таким образом, пользователь может нажать кнопку обновления, а затем выбрать элемент во время репопуляции списка, что приведет к ошибке.
начало кода, который обрабатывает нажатие кнопки:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await ViewModel.CreateMessageCommand();
Итак, так или иначе, чтобы нормально дождаться завершения этой задачи?
Ответы
Ответ 1
Так как обработчики событий для элементов управления обычно возвращают void
, вам нужно обработать это другим способом. Это часто означает, что в сценарии, подобном вашему, вам нужно отключить весь пользовательский интерфейс или часть его пользовательского интерфейса во время загрузки, то есть:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
// Make the "list" disabled, so the user can't "select an item" and cause an error, etc
DisableUI();
try
{
// Run your operation asynchronously
await ViewModel.CreateMessageCommand();
}
finally
{
EnableUI(); // Re-enable everything after the above completes
}
}
Ответ 2
Вы должны просто отключить все элементы пользовательского интерфейса, с которыми пользователь не должен взаимодействовать в начале действия, а затем включить их в конце.
Ответ 3
Один из способов - обернуть представление в BusyIndicator из WPF Toolkit
Вы предоставили бы свойство bool на вашей модели просмотра и переключили значение в начале и в конце.
Он помещает элемент пользовательского интерфейса выше всех других элементов управления, предотвращающих взаимодействие с пользователем, но предоставляя анимированное занятое сообщение, которое может быть обновлено, чтобы сказать все, что вы пожелаете.