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管道(如InitializeViewCreatedViewAppearing等)。这带来了一些进一步的问题,因为其他方法期望数据初始化已经完成。

那么,我应该在这里考虑什么以及如何处理这种情况。

谢谢!

答案

调用代码不能等待Start,因为它返回void。被抛出的任何异常都被吞噬了。如果该方法返回TaskTask<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

  1. 初始化:所有繁重的工作都应该在这里运行。此方法返回一个Task,这意味着您可以将其标记为异步并安全地使用await。如果此方法失败,您可能正在等待的Navigate调用将失败,因此您可能希望捕获该异常。
public async Task Initialize()
{
    await base.Initialize();

    await ProcessItems();
}

以上是关于MvvmCross ViewModel启动方法异步行为澄清的主要内容,如果未能解决你的问题,请参考以下文章

MvvmCross:GestureRecognized 绑定到 ViewModel 动作

MVVMCross 通知 ViewModel Model 属性的变化

Xamarin iOS - MVVMCross:无法使用 ViewModel 中的命令连接自定义单元格中的按钮

为 MvxTabViewController 托管和初始化多个 MVVMCross ViewModel

如何将 MVVMCross 与 C# 的标记绑定

如何在 mvvmcross 视图模型中使用异步?