簡體   English   中英

如何在后台運行F#中的阻塞調用?

[英]How run in background a blocking call in F#?

我需要在后台調用一個調用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)

如果您正在尋找簡單的火和忘記樣式來啟動API調用,請不要在當前線程上使用結果, Async.Start(task)可能就是您正在尋找的。 它需要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

這將啟動線程池上的任務,導航離開,但是如果異步任務失敗,它將觸發錯誤消息。 但是,它假定您的應用程序可以異步顯示錯誤消息,例如彈出窗口,而不僅僅是在啟動任務的頁面的上下文中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM