考慮設置一個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
。)