我正在尝试在F#中使用异步工作流来获取多个Web请求.
但是,我的一些请求偶尔会返回错误(例如http 500),我不知道如何处理这个问题.看起来我的F#程序在调试器中运行时陷入无限循环.
我可能错过了一些东西,因为我看到的例子没有开箱即用.我找到的第一件事就是帮助了这段代码:
type System.Net.WebRequest with
member req.GetResponseAsync() =
Async.BuildPrimitive(req.BeginGetResponse, req.EndGetResponse)
Run Code Online (Sandbox Code Playgroud)
然后我有一些代码来获取请求,这是我见过的例子中非常标准的:
let async_value = async {
let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
return (rsp :?> HttpWebResponse).StatusCode
}
Run Code Online (Sandbox Code Playgroud)
然后我试着得到结果:
let status = Async.RunSynchronously(async_value)
Run Code Online (Sandbox Code Playgroud)
但是当我在调试器中运行我的程序时,它会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可能是一个指标,我错过了一些东西...... = /
我疯了,试图找出如何使这项工作.代码看起来大致如下:
function onDropDownChanged() {
$("#updatePanel").load(
"myUrl",
{ id: $("#myDropDown option:selected").val() },
onPanelLoaded
);
}
function onPanelLoaded() {
$("#theTextInput").focus();
}
$(document).ready(function() {
$("#myDropDown").change(onDropDownChanged);
}
Run Code Online (Sandbox Code Playgroud)
第一次触发更改处理程序时,它会执行ajax更新,并且文本框会被聚焦.
但是,在后续更改中,它继续执行ajax更新,但文本框永远不会再次聚焦.
我发现,如果在onDropDownChanged,我$("#updatePanel").empty()在ajax调用之前添加,文本框将始终聚焦.问题是整个表格消失一秒钟,导致丑陋的闪光.鉴于ajax应该让这样的事情很好,这不是我想要使用的解决方法.