我正在尝试在 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
(Async.Parallel
(my_array_of_async_values))并行运行了几个请求,尽管我认为这与我遇到的异常问题无关。
我遇到的示例仅使用Async.Run
而不是Async.RunSynchronously
可能表明我缺少某些东西的事实... =/