[英]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.