C# 将ICommand定义为调用异步任务的异步lambda,还是仅定义为异步void?
考虑以下两种设置ICommand以执行异步任务的方法(在本例中,使用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
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
不能满足这一需求
因此,我发现公开异步任务
方法很有用。或者,如果你想变得更喜欢,开发一个新的。从这个设计的逻辑结论来看,你可以得到一个