2017-11-10 7 views
3

ウェブサービスを呼び出すAPIをバックグラウンドで呼び出す必要があります。私は(非常に複雑な)メソッドを非同期にすることはしません。ちょうど "これをバックグラウンドで行う"と言うだけです。F#でブロッキングコールをバックグラウンドで実行するにはどうすればよいですか?

しかし、私は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) 

答えて

3

あなたは、単純な火災を探している場合やAPIの呼び出しを開始するために、AN、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 

これは、それは意志、スレッドプールにタスクを開始離れて移動するが、場合には、非同期タスクが失敗しますエラーメッセージをトリガーします。ただし、アプリケーションでは、タスクを開始したページのコンテキストだけでなく、ポップアップなどの非同期的にエラーメッセージが表示されることが想定されています。

+0

いいえ、エラーを無視してナビゲートすることはできません。 – mamcx

+0

最初にバックグラウンドでAPIを呼び出す必要があるのはなぜですか?処理中にUIを応答させる場合、エラーメッセージを非同期的に表示することはできませんが、私は非同期メソッド全体を作成する以外の方法はわかりません。メソッドを高速化したい場合は、エラーを示す同期ポイントが問題です。処理が終了するまで待たずに、処理結果を待たなければなりません。 –

+0

はい、UIを反応させるためのものです。これを行うのは簡単ですが、別のスレッドでタスクをスケジュールするだけです:https://stackoverflow.com/questions/24056205/how-to-use-background-thread-in-swift – mamcx

関連する問題