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

时间:2017-11-10 23:26:50

标签: asynchronous f# background-process

我需要在后台调用一个调用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 个答案:

答案 0 :(得分:3)

如果您正在寻找简单的火并忘记启动API调用的样式,请不要在当前线程上使用结果,Async.Start(task)可能就是您要查找的内容。它需要printf工作流,在线程池上启动并立即返回,以便您的方法可以继续。

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

或者,如果您的应用程序模型允许,您可以执行以下操作:

SyncApi

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