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

如何在后台运行F#中的阻塞调用?

傅毅然
2023-03-14

我需要在后台调用一个调用webservice的API。我不想将(非常复杂的)方法转换为异步方法,只想说“在后台完成所有这些”。

但是我迷失在如何用F#做到这一点。这就是我所拥有的:

            let task = async {
                let result = SyncApi.syncData(login.url, login.zone, login.user, login.pwd) <-- THIS MUST RUN IN BACKGROUND...
                match result with
                |Some(msg) -> failwith msg
                | None -> ()
            }

            task
            |> Async.Catch
            |> Async.RunSynchronously
            |> fun x -> 
                  match x with
                  | Choice1Of2 x -> rootPage.Navigation.PopToRootAsync(true) |> ignore
                  | Choice2Of2 ex -> showMsgError(ex.Message)

共有1个答案

乜璞瑜
2023-03-14

如果您正在寻找简单的火和忘记样式来启动API调用和不使用当前线程上的结果,Async。开始(任务)可能是您正在寻找的。它采用Async工作流,在线程池上启动它并立即返回,以便您的方法可以继续。

但是看到您需要结果来更改导航或显示错误消息,您可能需要在当前线程上同步调用SyncApi并等待其结果。

或者,如果您的应用程序模型允许,您可以这样做:

(* Define the task including error handling. *)
let task = async {
    let result = SyncApi.syncData(login.url, login.zone, login.user, login.pwd)
    match result with
    | Some msg ->
        (* This may have to be posted back to the UI context.
           Correct way depends on technology (Xamarin vs. WPF vs. MVC...) *)
        showMsgError msg
    | None -> ()
}

(* Fire and forget the async API call. *)
Async.Start(task)

(* Optimistically navigate away immediately,
   while `task` may still be in progress. *)
rootPage.Navigation.PopToRootAsync(true) |> ignore

这将在线程池上启动任务,导航离开,但如果异步任务失败,它将触发错误消息。但是,它假设您的应用程序可以异步显示错误消息,例如作为弹出窗口,而不仅仅是在启动任务的页面的上下文中。

 类似资料:
  • 我正在使用Spring Webflux和Spring数据jpa,使用PostgreSql作为后端数据库。我不想在进行诸如查找和保存之类的db调用时阻塞主线程。为了实现同样的目标,我在Controller类中有一个主调度器,在服务类中有一个jdbcScheduler。 我定义它们的方式是: 现在,当在我的服务层中进行获取/保存调用时,我这样做: 在控制器中,我执行以下操作: 这是正确的吗?和/或有更

  • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

  • 在完美的世界,将没有战争或饥饿,所有 Api 将使用异步写,阳光明媚,绿色的草地有跳来跳去的兔子和手牵手的小羊羔。 但是,现实世界并不是这样。(你看过新闻最近吗?) 事实是,大多数库,特别是在JVM的生态,Y有许多是同步API,许多的方法有可能阻塞。一个很好的例子是JDBC API - 这是本质上的同步,不管如何努力尝试,Vert.x 不能撒上魔法使之同步。 我们不打算在一夜之间把一切改写成异步,

  • 问题内容: 在C / Linux / OS X上如何不阻塞控制台IO? 问题答案: 你不是,真的。TTY(控制台)是一个非常有限的设备,您几乎不做非阻塞I / O。当你看到的东西,看起来像非阻塞I / O,说在诅咒你做什么/ ncurses的应用程序,被称为 原始I / O 。在原始I / O中,没有字符的解释,没有擦除处理等。相反,您需要编写自己的代码来在执行其他操作时检查数据。 在现代C程序中

  • 我完全混淆了,,。 哪个是阻塞,哪个不是? 我的意思是如果我使用父进程是否等待子进程返回/才继续执行。 如何影响这些调用?