当前位置: 首页 > 知识库问答 >
问题:

Prism.Forms 中的异步调用

颛孙俊
2023-03-14

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

前段时间,我能够通过声明制作方法来做到这一点,例如

protected override void OnInitialized()

或者

public override async void OnNavigatedTo(NavigationParameters parameters)

在那里等候。然而,它停止了工作。

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

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

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

共有1个答案

邹海荣
2023-03-14

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

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

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

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

请注意,等待之后的一切都只是在整个导航完成后发生的。并且在那里抛出的异常不会显示(基本上是火和忘记)。

通过不使用async/await而使用< code >,您总是可以使延续显式。继续与(...)代替。

 类似资料:
  • 问题内容: 我需要Python中的一种回调类型的功能,在该功能中,我多次向Web服务发送请求,并且每次都更改参数。我希望这些请求同时发生而不是顺序发生,因此我希望函数被异步调用。 看起来异步可能是我想使用的东西,但是我所看到的有关其工作原理的示例看起来都像是过分杀了,所以我想知道是否还有其他方法应该走下去。对模块/过程有什么建议吗?理想情况下,我想以过程方式使用它们而不是创建类,但是我可能无法解决

  • 我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?

  • 本文向大家介绍JavaScript 异步调用,包括了JavaScript 异步调用的使用技巧和注意事项,需要的朋友参考一下 问题 可修改下面的 aa() 函数,目的是在一抄后用 console.log() 输出 want-value 但是,有额外要求: aa() 函数可以随意修改,但是不能有 console.log() 执行 console.log() 语句里不能有 setTimeout 包裹 解

  • Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。 注意:Provider端异步执行和Consumer端异步调用是相互独立的,你可以任意正交组合两端配置 Consumer同步 - Provider同步 C

  • 从v2.7.0开始,Dubbo的所有异步编程接口开始以CompletableFuture为基础 基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 使用CompletableFuture签名的接口 需要服务提供者事先定义CompletableFuture签名的服务,具体参见服务端异步执行接口定义: public interface Asyn

  • 同步调用异步方法最安全的方法是什么?