我有一些异步服务,我想在Xamarin应用程序的不同位置调用。我使用Prism从原生UWP应用程序移植我的代码。
前段时间我通过声明制作
之类的方法来做到这一点protected override void OnInitialized()
或
public override async void OnNavigatedTo(NavigationParameters parameters)
用于等待那里。但是,它停止了工作。
尝试使用GetAwaiter()。GetResult()阻止执行并导致死锁。
这有点奇怪,考虑到INavigationService.NavigateAsync本身是异步方法,但样本建议在没有任何等待的情况下在OnInitialized中使用,我认为这是错误的。
那么,是否有人建议如何在Prism.Forms中正确进行异步调用?
答案 0 :(得分:0)
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(...)
来显式继续。