异步方法 'anonymous' 不应该 return void

Asynchronous method 'anonymous' should not return void

谁能帮我解决这个问题我什么都试过了。 我通常知道如何解决该问题,但不知道如何使用匿名方法。 DelegateCommand 有 2 个构造函数。

1) public DelegateCommand (Action executeMethod)

2) public DelegateCommand (Action 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()
    {

    }
...

async await 只与 Func<Task>Func<Task<T>> 兼容,如果你没有那个,那么你有什么被认为是你不应该做的 "Async void"。

你的两个选择是不等待任务

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

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

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

public async Task enterButtonClicked()
{

}
...

这意味着 enterButtonClicked 引发的任何异常都不会被注意到

或者使用更好的支持异步函数的委托命令。我个人喜欢 Nito.Mvvm.Async NuGet package written by Stephen Cleary.

中的 AsyncCommand
...
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,这样除非操作完成,否则用户不能重复单击。