C#学习教程:MVVM c#如何将异步数据加载到属性中?分享


MVVM c#如何将异步数据加载到属性中?

我想知道是否有更好的方法将异步数据加载到属性中。 现在我创建一个异步函数并在属性的Get部分中引发一个Task,如下所示:

private ObservableCollection prope; public ObservableCollection Prope { get { if (prope == null) { Task.Run(()=> LoadData()).Wait(); } return proyectos; } set { prope = value; RaisePropertyChanged(); } } async private Task LoadData() { Prope = await clsStaticClassDataLoader.GetDataFromWebService(); } 

这种方法有效,但我不喜欢使用.Wait,因为如果服务没有快速响应,它可以冻结屏幕。

你能指导我这件事吗?

提前致谢

我处理这个的方法是在构造对象时开始加载属性的过程,但我没有等待结果。 由于属性在填充时通知,绑定工作正常。 基本上它的工作原理如下:

 public class MyClass : INotifyPropertyChanged { private ObservableCollection prope; public ObservableCollection Prope { get { return prope; } set { prope = value; RaisePropertyChanged(nameof(Prope)); } } public MyClass() { // Don't wait or await. When it's ready // the UI will get notified. LoadData(); } async private Task LoadData() { Prope = await clsStaticClassDataLoader.GetDataFromWebService(); } } 

这非常有效,并且不会在UI中造成任何延迟或卡顿。 如果您希望集合永远不为null (IMO的一个好习惯),您可以使用空集合预初始化prope字段。

我建议你阅读关于异步MVVM数据绑定的 MSDN文章。 我有一个提供NotifyTask类型 的库 ,可以这样使用:

 public class MyClass : INotifyPropertyChanged { public NotifyTask> Prope { get; private set; } public MyClass() { // Synchronously *start* the operation. Prope = NotifyTask.Create(LoadDataAsync()); } async private Task> LoadDataAsync() { return await clsStaticClassDataLoader.GetDataFromWebService(); } } 

然后你的数据绑定将在Prope.ResultPrope.Result

这种方法的优点是您还可以使用数据绑定来隐藏/显示忙指示符( Prope.IsNotCompleted ),在数据可用时显示控件( Prope.IsSuccessfullyCompleted )和错误通知( Prope.IsFaulted / Prope.ErrorMessage )。

此外,如果您愿意,可以指定非null默认值:

 Prope = NotifyTask.Create(LoadDataAsync(), new ObservableCollection()); 

您目前对Prope属性的实现没有多大意义。 在后台线程上执行LoadData方法毫无意义,因为在调用Wait()时无论如何都会阻塞主线程。 您也可以直接在LoadData()方法返回的任务上调用Wait()

 //BAD IMPLEMENTATION! private ObservableCollection prope; public ObservableCollection Prope { get { if (prope == null) LoadData().Wait(); return proyectos; } set { prope = value; RaisePropertyChanged(); } } 

上面的实现仍然很糟糕。 属性的getter不应该执行异步操作。 你应该阅读@Stephen Cleary关于这个主题的博客文章: https ://blog.stephencleary.com/2013/01/async-oop-3-properties.html

…并在他的AsyncEx库中查看他的NotifyTaskCompletion类型: https : //github.com/StephenCleary/AsyncEx

上述就是C#学习教程:MVVM c#如何将异步数据加载到属性中?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960046.html

发表评论

邮箱地址不会被公开。 必填项已用*标注