C# 将ICommand定义为调用异步任务的异步lambda,还是仅定义为异步void?

C# 将ICommand定义为调用异步任务的异步lambda,还是仅定义为异步void?,c#,async-await,icommand,C#,Async Await,Icommand,考虑以下两种设置ICommand以执行异步任务的方法(在本例中,使用Xamarin.Forms.Command,但我认为这并不重要): 场景1:将命令设置为异步lambda,在其中等待异步任务方法: // Command definition ToggleCheckedCommand = new Command( execute: async () => { await ToggleCheckedAsync(); }, canExecute: () => !IsBus

考虑以下两种设置ICommand以执行异步任务的方法(在本例中,使用
Xamarin.Forms.Command
,但我认为这并不重要):

场景1:将命令设置为异步lambda,在其中等待
异步任务
方法:

// 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;
}
// Command definition
ToggleCheckedCommand = new Command(
    execute: ToggleCheckedAsync,
    canExecute: () => !IsBusy);

// Method that is executed
private async void ToggleCheckedAsync()
{
    IsBusy = true;
    await DoWork();
    IsBusy = false;
}
场景2:将命令设置为
async void
方法:

// 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;
}
// 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中的异步lambda也可以有效地
async void

只要一个人从不直接调用ToggleCheckedAsync,这两种情况是等效的,还是有什么不同之处

任何一个都可以;它们是等价的方法
async void
在这里是合适的,因为
ICommand.Execute
在逻辑上是一个事件处理程序。(请不要搞错:两种方法中都存在
async-void
:第一个示例的lambda变为
async-void

然而,在我自己的代码中,这并不成立:

只要不直接调用ToggleCheckedAsync

特别是单元测试。单元测试可以直接执行您的命令,这包括能够
等待
直到它们完成,而
ICommand
不能满足这一需求

因此,我发现公开
异步任务
方法很有用。或者,如果你想变得更喜欢,开发一个新的。从这个设计的逻辑结论来看,你可以得到一个