Ich versuche, asynchrone Workflows in F# zu verwenden, um mehrere Webanforderungen abzurufen.
Einige meiner Anfragen geben jedoch gelegentlich Fehler zurück (z. B. http 500), und ich weiß nicht, wie ich damit umgehen soll. Es scheint, wie mein F#-Programm in einer Endlosschleife stecken bleibt, wenn im Debugger ausgeführt.
Wahrscheinlich übersehe ich etwas, denn die Beispiele, die ich gesehen habe, ließen sich nicht sofort kompilieren. Das erste, was ich gefunden, die geholfen hat, war dieses Bit von Code:
type System.Net.WebRequest with
member req.GetResponseAsync() =
Async.BuildPrimitive(req.BeginGetResponse, req.EndGetResponse)
und dann habe ich mein Stückchen Code, um die Anfragen zu holen, das ist ziemlich Standard von Beispielen, die ich gesehen habe:
let async_value = async {
let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
return (rsp :?> HttpWebResponse).StatusCode
}
und dann versuche ich, das Ergebnis zu erhalten:
let status = Async.RunSynchronously(async_value)
Aber wenn ich mein Programm im Debugger ausführe, bricht es bei req.EndGetResponse
weil der Server einen internen Serverfehler 500 zurückgegeben hat. Wenn ich die Ausführung fortsetze, gerät sie in eine komische Schleife und bricht bei req.EndGetResponse
(manchmal mehrere hintereinander), und bei let status = Async.RunSynchronously
(async_value).
Wie kann ich das Ausnahmeproblem umgehen, damit ich meinen Statuscode bekomme? Brauche ich außerdem die oben beschriebene Typisierung? Oder vermisse ich einige Bibliothek/Dll für F#/VS 2010 Beta 1, von denen dies bereits ein Teil ist?
Ich lasse mehrere Anfragen parallel laufen, indem ich Async.RunSynchronously
( Async.Parallel
(my_array_of_async_values)), obwohl ich nicht denke, dass ist im Zusammenhang mit der Ausnahme Problem ich habe.
Die Beispiele, die ich kenne, verwenden nur Async.Run
statt Async.RunSynchronously
ist wahrscheinlich ein Hinweis darauf, dass ich etwas übersehe... =/