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

问题描述 投票:0回答:2

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

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

谢谢!

async-await mvvmcross
2个回答
2
投票

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

这个问题在MvvmCross 5及更高版本中得到修复,你可以用Task Initialize方法代替这个void Start方法进行同样的初始化。


2
投票

自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();
}
© www.soinside.com 2019 - 2024. All rights reserved.