Prism.Forms中的异步调用

时间:2017-07-12 04:18:47

标签: asynchronous xamarin async-await prism

我有一些异步服务,我想在Xamarin应用程序的不同位置调用。我使用Prism从原生UWP应用程序移植我的代码。

前段时间我通过声明制作

之类的方法来做到这一点
protected override void OnInitialized()

public override async void OnNavigatedTo(NavigationParameters parameters)

用于等待那里。但是,它停止了工作。

尝试使用GetAwaiter()。GetResult()阻止执行并导致死锁。

这有点奇怪,考虑到INavigationService.NavigateAsync本身是异步方法,但样本建议在没有任何等待的情况下在OnInitialized中使用,我认为这是错误的。

那么,是否有人建议如何在Prism.Forms中正确进行异步调用?

1 个答案:

答案 0 :(得分:0)

从UI线程调用

OnNavigatedTo(它是UI生命周期的一部分)。如果阻止该方法,你当然会陷入僵局。

仅仅因为NavigateAsync返回一个Task并且具有异步名称,并不意味着该方法中的所有内容都发生在另一个线程上。它只是意味着它通常会做某些事情,你可以等待。

这里的问题是OnNavigatedTo正在返回void,所以一旦你在那里等待,它就会返回给调用者。这并不能阻止你使用它,你只能阻止

public override async void OnNavigatedTo(NavigationParameters parameters)
{
    // do sync stuff
    await DoSomethingAsync();
    // this happens after all the other lifecycle methods
}

请注意,等待之后的所有事情都会在整个导航完成后发生。那里抛出的异常不会出现(它基本上是火和忘记)。

您始终可以通过不使用async / await并使用.ContinueWith(...)来显式继续。