考虑设置一个ICommand执行异步任务的以下两种方式(在这种情况下,使用Xamarin.Forms.Command
,但我希望这不是关键):定义ICommand作为异步lambda调用异步任务,或只是异步无效?
方案1:命令设置中,等待异步拉姆达一个async Task
方法:
// Command definition
ToggleCheckedCommand = new Command(
execute: async() => { await ToggleCheckedAsync(); },
canExecute:() => !IsBusy);
// Method that is executed
private async Task ToggleCheckedAsync()
{
IsBusy = true;
await DoWork();
IsBusy = false;
}
方案2:该命令设置为一个async void
方法:
// Command definition
ToggleCheckedCommand = new Command(
execute: ToggleCheckedAsync,
canExecute:() => !IsBusy);
// Method that is executed
private async void ToggleCheckedAsync()
{
IsBusy = true;
await DoWork();
IsBusy = false;
}
只要因为一个人不会直接呼叫ToggleCheckedAsync
,这两种情况是否相同,或者与其他情况相比,有没有一个问题?
(我知道async void
被普遍认为是外界的直接事件处理不好的做法,但ToggleCheckedAsync
是逻辑上的事件处理程序,并在方案1中的异步拉姆达也AFAIK有效async void
。)