Mis*_*tyK 7 c# wpf asynchronous mvvm async-await
我试着理解如何在我的ViewModel中使用async/await模式接收初始数据.我们来看看代码:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
PeopleService包含People Data的异步方法.注入IOC(无论如何).之后我调用异步操作LoadMyData(以防止阻塞UI,因此没有await关键字),并且在该方法中,我从服务中调用异步操作来捕获所有异常并且不对用户进行操作.这种方法有什么问题?
我从msdn阅读文章:https://msdn.microsoft.com/en-us/magazine/dn605875.aspx当我注意到为这种任务创建一个泛型类并更改我的所有属性以将该类用作泛型参数,更改XAML Bindings以接收Property.Result属性,我认为这很疯狂并且在项目中造成了很大的混乱.此外,ViewModel中的属性指定此属性是异步的,在我看来是糟糕的设计.什么是最简单的方法来解决我的问题?我的解决方案是否可以保持简单?
之后我调用异步操作LoadMyData(以防止阻塞UI,因此没有await关键字),并且在该方法中,我从服务中调用异步操作来捕获所有异常并且不对用户进行操作.这种方法有什么问题?
加载数据时不会阻止您的UI.非常好.但异步数据加载会带来一些问题:在加载数据时UI会显示什么?UI如何向用户显示错误?
在当前代码中,UI列表在加载数据时只是空的.IMO应至少具有"加载"类型的状态,因此用户可以区分空结果集和仍在进行中的操作.另外,notify user
我假设您的代码是通过代码而不是通过数据绑定来打开对话框或其他内容.IMO错误指示器优于模态对话框.
其背后的目的NotifyTaskCompletion<T>
是它充当数据绑定异步操作.因此,您可以使用其属性更改为"加载"和"错误"状态.这就是您的绑定必须更改为.Result
- 因为您绑定到异步操作的结果.如果您不想显示"加载"指示器并且您不希望通过数据绑定显示错误,那么是的,NotifyTaskCompletion<T>
将是过度杀伤.
这取决于你想要做多少数据绑定.如果你对代码感到满意,那就没关系了:
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
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用数据绑定完成所有操作,这使您的代码更简单:
// (wrapped in NotifyTaskCompletion)
public async Task LoadMyData(IPeopleService peopleService)
{
People = await peopleService.GetPeopleAsync();
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了两种方式,但NotifyTaskCompletion<T>
如果我有一个执行大量异步操作的项目,我会倾向于.
归档时间: |
|
查看次数: |
8556 次 |
最近记录: |