MvvmCross ViewModel启动方法异步行为澄清

时间:2018-02-27 18:19:15

标签: async-await mvvmcross

在我的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等。)在等待之前方法实际完成工作。 这带来了一些进一步的问题,因为其他方法期望数据初始化已经完成。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

调用代码无法等待Start,因为它正在返回void。被抛出的任何异常都被吞噬了。如果方法返回TaskTask<T>,那么这将按预期工作。除了在事件处理程序中,你几乎不想使用async void。有一个MSDN article进一步详细说明应该避免async void的原因。

此问题在MvvmCross 5及更高版本中得到修复,您可以在Task Initialize方法中使用void Start方法执行相同类型的初始化,而不是此String s1 = "cat"; String s2 = ""; for (int i =0 ; i < s1.length(); i++) { s2 = s1.charAt(i) + s2; } System.out.println(s2); 方法。

答案 1 :(得分:2)

自MvvmCross 5.0以来,有一个新的生命周期。 https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle#initialize 请使用Initialize代替Start。{/ p>

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

    await ProcessItems();
}