Asynchronous Prism.Forms中的异步调用

Asynchronous Prism.Forms中的异步调用,asynchronous,xamarin,async-await,prism,Asynchronous,Xamarin,Async Await,Prism,我想在Xamarin应用程序的不同位置调用一些异步服务。我使用Prism从本机UWP应用程序移植代码 不久前,我可以通过声明 protected override void OnInitialized() 或 我在那儿等你。然而,它停止了工作 试图使用GetAwaiter().GetResult()会阻止执行并导致死锁 考虑到INavigationService.NavigateAsync本身是异步方法,这有点奇怪,但示例建议在OnInitialized中使用,而无需等待,我认为这是错误的 那

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

不久前,我可以通过声明

protected override void OnInitialized()

我在那儿等你。然而,它停止了工作

试图使用GetAwaiter().GetResult()会阻止执行并导致死锁

考虑到INavigationService.NavigateAsync本身是异步方法,这有点奇怪,但示例建议在OnInitialized中使用,而无需等待,我认为这是错误的


那么,有没有人对如何在Prism.Forms中正确地进行异步调用有什么建议?

OnNavigatedTo
从UI线程调用(它是UI生命周期的一部分)。如果在该方法内部阻塞,当然会出现死锁

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

这里的问题是,
OnNavigatedTo
正在返回
void
,因此一旦您在那里有等待,它将返回给调用者。这并不能阻止你使用它,你只是不能在那里阻止它

public override async void OnNavigatedTo(NavigationParameters parameters)
{
    // do sync stuff
    await DoSomethingAsync();
    // this happens after all the other lifecycle methods
}
请注意,等待之后的一切都是在整个导航完成之后发生的。并且抛出的异常将不会出现(基本上是fire And forget)


通过不使用async/await,而是使用
.ContinueWith(…)
,您可以始终使延续显式化。

这正是我以前的工作方式。但我有几个月没有接触过Android部分,可能是通过nugget进行了几次升级,现在你描述的方式给了我未处理的异常。具体来说,我使用SQLite,当我等待异步代码时,它会中断。当我用sync调用替换完全相同的线路时,它是有效的。还有一件事,这种方法在UWP应用程序中对我有效,我的问题出在Xamarin。到底有什么例外?这主要是由于在某个地方调用Task.Result,这几乎是你们永远都不应该做的。它崩溃得太厉害了,我甚至无法捕捉到异常。在我更新到最新版本的SQLite之后,OnNavigatedTo的问题似乎消失了,我不知道它与此相关,但我仍然存在PrismApplication.OnInitialized的问题。在那里,它惨不忍睹地坠毁了,甚至毫无例外。目前我通过在新线程中启动这个东西找到了解决方案,所以我所做的是:TaskFactory.StartNew(()=>{try{().GetAwaiter().GetResult();}catch(Exception ex){…handling Exception}}这段代码成功了。
public override async void OnNavigatedTo(NavigationParameters parameters)
{
    // do sync stuff
    await DoSomethingAsync();
    // this happens after all the other lifecycle methods
}