Async.AwaitTask
でHttpClient
を呼び出し、エージェント(MailboxProcessor)から呼び出されています。私はHTTP呼び出し中にエラーをキャッチしたいので、非同期ワークフローでtry...with
を使用しましたが、クライアント側のタイムアウト例外をキャッチしてエージェントがクラッシュする原因となります。非同期ワークフロー内でHttpClientタイムアウトを取得する
最小再現:
#r "System.Net.Http"
open System
open System.Net.Http
let client = new HttpClient()
client.Timeout <- TimeSpan.FromSeconds(1.)
async {
try
let! content = Async.AwaitTask <| client.GetStringAsync("http://fake-response.appspot.com/?sleep=30")
return content
with ex ->
// Does not catch client-side timeout exception
return "Caught it!"
}
|> Async.RunSynchronously
// Throws System.OperationCanceledException: The operation was canceled
私はそれが完全にsyncronousすることによってそれを修正することができますが、並行して、これらの多くを実行しているかもしれないとして、スタック全体の非同期を維持することを好む:
#r "System.Net.Http"
open System
open System.Net.Http
let client = new HttpClient()
client.Timeout <- TimeSpan.FromSeconds(1.)
try
Async.AwaitTask <| client.GetStringAsync("http://fake-response.appspot.com/?sleep=30")
|> Async.RunSynchronously
with ex ->
"Caught it!"
// Returns "Caught it!"
OperationCanceledException
を非同期コンテキスト内で捕捉する有効な方法はありますか?
「Async.Catch」は、実際に例外を捕捉しないことを除いて、この動作が意図されているように見えます。動作は同じですOPの例として。 –