MvvmCross ViewModel启动方法异步行为澄清
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MvvmCross ViewModel启动方法异步行为澄清相关的知识,希望对你有一定的参考价值。
在我的ViewModel中,我在(覆盖)Start
方法中加载数据,如下所示:
public override async void Start()
{
base.Start();
await ProcessItems();
// or the following (no difference for Start method behavior)
await ProcessItems().ConfigureAwait(false);
}
但是,看起来await / async逻辑实际上并不适用于该方法(尽管我只使用android测试过它)。 “不起作用”意味着在调用我等待的ProcessItems之后,在等待的方法实际完成工作之前调用所有其余的ViewModel管道(如Initialize
,ViewCreated
,ViewAppearing
等)。这带来了一些进一步的问题,因为其他方法期望数据初始化已经完成。
那么,我应该在这里考虑什么以及如何处理这种情况。
谢谢!
调用代码不能等待Start
,因为它返回void
。被抛出的任何异常都被吞噬了。如果该方法返回Task
或Task<T>
,那么这将按预期工作。你几乎不想在事件处理程序中使用async void
。有一个MSDN article进一步详细说明为什么应该避免async void
。
这个问题在MvvmCross 5及更高版本中得到修复,你可以用Task Initialize
方法代替这个void Start
方法进行同样的初始化。
自MvvmCross 5.0以来,有一个新的生命周期。 https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle#initialize请使用Initialize
代替Start
。
- 初始化:所有繁重的工作都应该在这里运行。此方法返回一个Task,这意味着您可以将其标记为异步并安全地使用await。如果此方法失败,您可能正在等待的Navigate调用将失败,因此您可能希望捕获该异常。
public async Task Initialize()
{
await base.Initialize();
await ProcessItems();
}
以上是关于MvvmCross ViewModel启动方法异步行为澄清的主要内容,如果未能解决你的问题,请参考以下文章
MvvmCross:GestureRecognized 绑定到 ViewModel 动作
MVVMCross 通知 ViewModel Model 属性的变化
Xamarin iOS - MVVMCross:无法使用 ViewModel 中的命令连接自定义单元格中的按钮