2011-03-31 40 views
1

我有一些代碼迭代了幾百個URL並從網上請求數據。HttpWebRequest.BeginGetResponse不是異步

它看起來是這樣的

for each url in urls 
    Dim hwr = CType(WebRequest.Create(url), HttpWebRequest) 
    Dim rq = New ReqArgs 
    rq.Url= url 
    rq.Request = hwr 
    Dim res = 
    hwr.BeginGetResponse(New AsyncCallback(AddressOf FinishWebRequest), rq) 
    Dim a = 1 
next 

這是否看行嗎?

爲什麼BeginGetresponse行佔用了大約2-3秒之前要去dim a=1

實際上,我調試過,並且我看到FinishWebRequest過程在達到Dim a=1之前完全運行。

那麼這是異步?

我沒有通過使用異步賺取任何時間。我是嗎?還是有不同的方式來做到這一點?

的一點是,主要分應該斷火300個請求並返回控制到UI,那麼FinishWebRequest應該處理他們慢慢在自己的線程和自己的時間,因爲請求進來,

怎麼辦我這樣做?

順便說一下,主要分是在BackgroundWorker運行,但我檢查了BackgroundWorker和問題是一樣的

看來,答案應該是here但它只是不工作對我來說

我是WPF 4.0

感謝您的幫助和建議。由於

+0

謝謝,Giddy!有人對我有任何答案嗎? – 2011-04-01 08:21:52

+0

我認爲我的問題是,即時通訊使用POST,而不是GET。我會檢查這個,然後POST(杜!) – 2011-04-01 09:42:01

回答

4

的問題是與POST

我現在開始後寫這樣

Dim ReqStream = hwr.BeginGetRequestStream(New AsyncCallback(AddressOf FinishRequestStream), rq) 

,然後我的回調是這樣

Sub FinishRequestStream(ByVal result As IAsyncResult) 
    Dim ag = CType(result.AsyncState, ReqArgs) 
    Dim postStream = ag.Request.EndGetRequestStream(result) 
    Dim PostBytes = Encoding.UTF8.GetBytes(ag.PostText) 
    postStream.Write(PostBytes, 0, PostBytes.Length) 
    postStream.Close() 
    Dim res = ag.Request.BeginGetResponse(New AsyncCallback(AddressOf FinishResponse), ag) 
End Sub 

希望這有助於未來的某人

+0

它幫助我!謝謝! – 2011-05-16 15:18:31

1

從其他question轉發此錯誤。

documentation on HttpWebRequest.BeginGetResponse Method

的BeginGetResponse方法需要一些同步設置任務完成(DNS解析,代理檢測,和TCP套接字連接,例如)之前該方法變得異步的。 在引發錯誤的異常或方法成功之前,可能需要花費相當長的時間(最長達數分鐘,具體取決於網絡設置)才能完成初始同步設置任務。

爲了避免等待的設置,您可以使用 HttpWebRequest.BeginGetRequestStream Method 但是要注意:

您的應用程序無法處理特定請求混合同步和異步方法。如果您調用BeginGetRequestStream方法,則必須使用BeginGetResponse方法來檢索響應。