我試圖使用異步工作流在F#中獲取一些Web請求。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
打破,因爲服務器如果我只保留繼續execu返回內部服務器錯誤500。重刑,它得到的一個時髦的循環,在req.EndGetResponse
突破(有時連續幾個),並讓status = Async.RunSynchronously
(async_value)。
如何得到解決異常問題,所以我可以得到我的狀態代碼?另外,我是否需要上述類型的東西?或者我錯過了一些F#/ VS 2010 Beta 1的庫/ dll,其中這已經是其中的一部分了?
我實際上並行運行多個請求,使用Async.RunSynchronously
(Async.Parallel
(my_array_of_async_values)),雖然我不認爲這與我遇到的異常問題有關。
我遇到只例子使用Async.Run
而不是Async.RunSynchronously
,原因可能是我想的東西的指標... =/
是的,我明白我做了什麼錯。這也是部分工具行爲(vs2010b1)關於異常調試怪異的一部分。 我曾試圖獲取StatusCode,這是我甚至關心的唯一一部分響應,無需處理異常。 – jessicah 2009-09-09 03:47:26