Асинхронный метод "анонимный" не должен возвращать void

Может кто-нибудь помочь мне решить эту проблему, я все перепробовал. Я обычно знаю, как решить эту проблему, но не с помощью анонимного метода. DelegateCommand имеет 2 конструктора.

1) публичный DelegateCommand (действие executeMethod)

2) public DelegateCommand (Действие executeMethod, Func canExecute).

Я хочу знать, можно ли как-то убрать это предупреждение. Асинхронизация и ожидание необходимы, иначе мой метод: enterButtonClicked(); будет вызываться синхронно.

 ...
    public DelegateCommand EnterButton { get; set; }

    public StartPageViewModel()
    {
        Title = "title_black.png";
        PasswordPlaceholder = "Lozinka";

        EnterButton = new DelegateCommand( async () => { await enterButtonClicked();}); // <----- I am getting that warning here
    }

    public async Task enterButtonClicked()
    {

    }
...

1 ответ

Решение

Асинхронное ожидание совместимо только с Func<Task> или же Func<Task<T>> если у вас этого нет, то у вас есть то, что считается "асинхронной пустотой", чего не следует делать.

Ваши два варианта не ждать задачи

...
public DelegateCommand EnterButton { get; set; }

public StartPageViewModel()
{
    Title = "title_black.png";
    PasswordPlaceholder = "Lozinka";

    EnterButton = new DelegateCommand( () => { var temp = enterButtonClicked();}); 
}

public async Task enterButtonClicked()
{

}
...

Это означает, что любые исключения, вызванные enterButtonClicked, останутся незамеченными

или используйте лучшую команду делегата, которая поддерживает асинхронные функции. Лично мне нравится AsyncCommand из пакета Nito.Mvvm.Async NuGet, написанного Stephen Cleary.

...
public AsyncCommand EnterButton { get; set; }

public StartPageViewModel()
{
    Title = "title_black.png";
    PasswordPlaceholder = "Lozinka";

    EnterButton = new DelegateCommand(enterButtonClicked); //you can just use a delegate, no method needed.
}

public async Task enterButtonClicked()
{

}
...

AsyncCommand наборы делегатов CanExecute в false во время выполнения задачи, чтобы человек не мог повторно щелкнуть, если действие не выполнено.

Другие вопросы по тегам