Sto provando a utilizzare i flussi di lavoro asincroni in F # per recuperare diverse richieste web.Richiesta web asincrona F #, gestione delle eccezioni
Tuttavia, alcune delle mie richieste occasionalmente restituiscono errori (ad esempio http 500) e non so come gestirlo. Sembra che il mio programma F # rimanga bloccato in un ciclo infinito durante l'esecuzione nel debugger.
Probabilmente mi mancano alcune cose, perché gli esempi che ho visto non sono stati compilati immediatamente. La prima cosa che ho trovato che ha aiutato è stato questo pezzo di codice:
type System.Net.WebRequest with
member req.GetResponseAsync() =
Async.BuildPrimitive(req.BeginGetResponse, req.EndGetResponse)
e poi ho la mia parte di codice per prendere le richieste, che è abbastanza standard da esempi che ho visto:
let async_value = async {
let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
return (rsp :?> HttpWebResponse).StatusCode
}
e poi cerco di ottenere il risultato:
let status = Async.RunSynchronously(async_value)
Ma quando eseguo il mio programma nel debugger, si rompe a causa req.EndGetResponse
server ha restituito errore interno del server 500. Se continuo solo continuare execu zione, entra in un loop funky, rompendo a req.EndGetResponse
(a volte più di una riga), e a lasciare status = Async.RunSynchronously
(async_value).
Come posso risolvere il problema di eccezione in modo da poter ottenere il mio codice di stato? Inoltre, ho bisogno del tipo di cosa che ho fatto sopra? O mi manca qualche libreria/dll per F #/VS 2010 Beta 1, di cui questa è già una parte?
Io in realtà gestiscono diverse richieste in parallelo, utilizzando Async.RunSynchronously
(Async.Parallel
(my_array_of_async_values)), anche se non credo che è legato alla questione eccezione che sto avendo.
Il fatto gli esempi che ho incontrato solo per uso Async.Run
piuttosto che Async.RunSynchronously
è probabilmente un indicatore che mi manca qualcosa ... =/
Sì, vedo quello che avevo fatto di sbagliato. Era anche il comportamento degli strumenti di parte (vs2010b1) per quanto riguarda le eccezioni di debugging. Avevo tentato di ottenere solo lo StatusCode, l'unica parte della risposta di cui mi preoccupavo, senza gestire l'eccezione. – jessicah