Bazı web isteklerini almak için F # içinde async iş akışlarını kullanmaya çalışıyorum. Ancak, bazı isteklerim bazen geri dönen hatalardır (ör. Http 500) ve bunun nasıl ele alınacağını bilmiyorum. Hata ayıklayıcısında çalışırken F # programım sonsuz bir döngüde sıkışmış gibi görünüyor.F # async web isteği, özel durumlar ele alınması
Muhtemelen bazı şeyleri özlüyorum, çünkü gördüğüm örnekler kutunun dışında derlemediler. oldu yardımcı buldum ilk şey bu kod bit:
let async_value = async {
let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
return (rsp :?> HttpWebResponse).StatusCode
}
: o zaman ben gördüğüm örneklerden oldukça standart istekleri getirmek için kod rolümü var
type System.Net.WebRequest with
member req.GetResponseAsync() =
Async.BuildPrimitive(req.BeginGetResponse, req.EndGetResponse)
ve ve sonra sonuç elde etmeye çalışmak:
let status = Async.RunSynchronously(async_value)
Ama ayıklayıcısında benim program çalıştırdığınızda Ben sadece devam execu tutarsanız sunucu iç sunucu hatası 500. döndürdü çünkü req.EndGetResponse
de kırar Bu, req.EndGetResponse
(bazen bir satırda birkaç kez) ile kırma ve status = Async.RunSynchronously
(async_value) olsun, korkak bir döngü içinde alır.
Durum kodumu alabilmem için istisna sorununu nasıl çözebilirim? Ayrıca, yukarıda yaptığım şey tipine ihtiyacım var mı? Yoksa bu zaten bir parçası olan F #/VS 2010 Beta 1 için bir kütüphane/dll eksik mi?
Async.RunSynchronously
(Async.Parallel
(my_array_of_async_values)) işlevini kullanarak paralel olarak birkaç istek çalışıyorum, ancak bunun istisna sorunuyla ilgili olduğunu düşünmüyorum.
Ben sadece rastlamak ettik örnekler Async.Run
yerine Async.RunSynchronously
kullanmak aslında muhtemelen bir şey eksik bir göstergesidir ... =/
Evet, yanlış yaptıklarını görüyoruz. Ayrıca hata ayıklama garipliği ile ilgili olarak kısmen takım davranışı (vs2010b1) oldu. Sadece istisna olmaksızın, baktığım yanıtın tek parçası olan StatusCode'u almaya çalışmıştım. – jessicah