gpt4 book ai didi

c# - MVVM XAML 应用程序中的异步等待

转载 作者:太空狗 更新时间:2023-10-29 20:13:19 26 4
gpt4 key购买 nike

我试图了解我应该如何使用异步/等待模式在我的 ViewModel 中接收初始数据。让我们看一下代码:

public interface IPeopleService
{
Task<IEnumerable<Person> GetPeopleAsync();
}


public MainViewModel
{
public ObservableCollection<Person> People{get;set;}

public MainViewModel(IPeopleService peopleService)
{
LoadMyData(peopleService);
}

public async Task LoadMyData(IPeopleService peopleService)
{
try
{
People = await peopleService.GetPeopleAsync();
}
catch(Exception e)
{
//log
//notify user
}
}

}

有一个 PeopleService,它包含对 People Data 的异步方法。它注入(inject)了 IOC(无论如何)。之后我调用异步操作 LoadMyData(以防止阻塞 UI,因此没有 await 关键字)并在该方法中我从服务中调用异步操作以捕获所有异常并通知用户。这种方法有什么问题?

我从 msdn 阅读文章:https://msdn.microsoft.com/en-us/magazine/dn605875.aspx当我注意到为这种任务创建一个通用类并更改我的所有属性以将该类用作通用参数时,更改 XAML 绑定(bind)以接收 Property.Result 属性时,我认为这很疯狂并且在项目中造成了很大的困惑。此外,ViewModel 中的属性指定此属性是异步的,在我看来这是糟糕的设计。解决我的问题的最简单方法是什么?我的解决方案是否可以让一切变得简单?

最佳答案

After that I invoke asynchronous operation LoadMyData (to prevent blocking UI, so no await keyword) and inside that method I invoke asynchronous operation from service catching all exceptions and notyfying user. What's wrong with this approach?

您的用户界面在加载数据时不会被阻塞。那挺好的。但是异步数据加载带来了一些问题:数据加载时 UI 显示什么? UI 如何向用户显示错误?

在您当前的代码中,加载数据时 UI 列表只是空的。 IMO 至少应该有一种“加载”状态,以便用户可以区分空结果集和仍在进行中的操作。另外,你的 notify user我假设的代码是通过代码而不是通过数据绑定(bind)来调出一个对话框或其他东西。 IMO 错误指示器比模态对话框更好。

NotifyTaskCompletion<T>背后的目的是它充当数据可绑定(bind)的异步操作。所以你可以使用它的属性来改变“加载”和“错误”状态。这就是为什么您的绑定(bind)必须更改为 .Result 的原因- 因为您要绑定(bind)到异步操作的结果。如果您不想显示“正在加载”指示器并且不想通过数据绑定(bind)显示错误,那么可以,NotifyTaskCompletion<T>会矫枉过正。

这取决于您想要进行数据绑定(bind)的程度。如果您对所有内容都在代码中感到满意,那很好:

public async Task LoadMyData(IPeopleService peopleService)
{
try
{
... // Hide people display
... // Show loading indicator
People = await peopleService.GetPeopleAsync();
... // Show people display
}
catch(Exception e)
{
... // Show error indicator
}
finally
{
... // Hide loading indicator
}
}

或者,您可以使用数据绑定(bind)来完成这一切,这会使您的代码更简单:

// (wrapped in NotifyTaskCompletion)
public async Task LoadMyData(IPeopleService peopleService)
{
People = await peopleService.GetPeopleAsync();
}

两种方法我都做过,但我倾向于 NotifyTaskCompletion<T>如果我有一个执行大量异步操作的项目。

关于c# - MVVM XAML 应用程序中的异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28411306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com