Можно ли ждать асинхронных задач во время нажатия кнопки? - программирование
Подтвердить что ты не робот

Можно ли ждать асинхронных задач во время нажатия кнопки?

У меня есть кнопка обновления в моем приложении, которая использует некоторые асинхронные методы для обновления списка отображаемых элементов. Проблема в том, что у меня не может быть возвращаемого типа Task для обработчика события для нажатия кнопки, поэтому мне остается метод async void. Таким образом, пользователь может нажать кнопку обновления, а затем выбрать элемент во время репопуляции списка, что приведет к ошибке.

начало кода, который обрабатывает нажатие кнопки:

    private async void Button_Click_1(object sender, RoutedEventArgs e)
    {


        await ViewModel.CreateMessageCommand();

Итак, так или иначе, чтобы нормально дождаться завершения этой задачи?

4b9b3361

Ответ 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 на вашей модели просмотра и переключили значение в начале и в конце.

Он помещает элемент пользовательского интерфейса выше всех других элементов управления, предотвращающих взаимодействие с пользователем, но предоставляя анимированное занятое сообщение, которое может быть обновлено, чтобы сказать все, что вы пожелаете.