异步方法' anonymous'不应该归还无效

时间:2017-09-21 21:51:18

标签: c# asynchronous xamarin.forms prism anonymous-function

有人可以帮我解决这个问题我尝试了一切。 我通常知道如何解决这个问题,但不知道如何解决这个问题。 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()
    {

    }
...

1 个答案:

答案 0 :(得分:3)

async await仅与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引发的任何异常都将被忽视

或使用支持异步函数的更好的委托命令。我个人喜欢Nito.Mvvm.Async编写的Stephen Cleary NuGet包中的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,以便除非操作已完成,否则无法重复点击。