F# で非同期ワークフローを使用して、複数の Web 要求を取得しようとしています。
ただし、一部のリクエストで時折エラーが返され (例: http 500)、これを処理する方法がわかりません。デバッガーで実行すると、F# プログラムが無限ループに陥ってしまうようです。
私が見た例はそのままではコンパイルされなかったので、おそらくいくつかのものが欠けています。最初に役に立ったのは、次のコードです。
type System.Net.WebRequest with
member req.GetResponseAsync() =
Async.BuildPrimitive(req.BeginGetResponse, req.EndGetResponse)
そして、リクエストをフェッチするためのコードが少しあります。これは、私が見た例からはかなり標準的です。
let async_value = async {
let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
return (rsp :?> HttpWebResponse).StatusCode
}
そして、結果を取得しようとします:
let status = Async.RunSynchronously(async_value)
しかし、デバッガーでプログラムを実行すると、req.EndGetResponse
サーバーが内部サーバー エラー 500 を返したため、で中断します。実行を継続し続けると、ファンキー ループに入り、req.EndGetResponse
(場合によっては連続していくつか) と let status = Async.RunSynchronously
(async_value)で中断します。 .
例外の問題を回避してステータス コードを取得するにはどうすればよいですか? また、上記で行ったタイプのものが必要ですか? それとも、F#/VS 2010 Beta 1 用のライブラリ/dll が不足していますか?
Async.RunSynchronously
私は実際に( (my_array_of_async_values))を使用して複数のリクエストを並行して実行Async.Parallel
していますが、それが私が抱えている例外の問題に関連しているとは思いません。
私が遭遇した例は、おそらく何かが欠けている指標ではAsync.Run
なく、使用のみを使用しているという事実... =/Async.RunSynchronously