HttpWebRequest.BeginGetResponse不是Async

时间:2011-03-31 16:50:27

标签: wpf vb.net .net-4.0 asynchronous httpwebrequest

我有一些代码可以迭代几个网址并从网上请求数据。

它看起来像这样

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行如何在转到dim a=1之前完成 2-3 秒。

实际上我调试了,我发现FinishWebRequest程序在到达Dim a=1之前完全运行。

这是异步吗?

我不是通过使用异步来赚取任何时间。我呢?或者有不同的方法来做到这一点吗?

关键是主要子应该触发300个请求并将控制权返回给UI,然后FinishWebRequest应该在请求进入时在自己的线程和自己的时间上慢慢处理它们。

我该怎么做?

顺便说一句,主要子项在BackgroundWorker中运行,但我检查了BackgroundWorker并且问题是相同的

似乎答案应该是here,但它不适合我

我是WPF 4.0

感谢您的帮助和建议。感谢

2 个答案:

答案 0 :(得分: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

希望这可以帮助将来的某个人

答案 1 :(得分:1)

从另一个question重新发布此内容。

来自documentation on HttpWebRequest.BeginGetResponse Method

  

在此方法变为异步之前,BeginGetResponse方法需要完成一些同步设置任务(例如,DNS解析,代理检测和TCP套接字连接)。 [...]   在抛出错误异常或方法成功之前,可能需要相当长的时间(最多几分钟,具体取决于网络设置)才能完成初始同步设置任务。

为避免等待设置,您可以使用 HttpWebRequest.BeginGetRequestStream Method 但请注意:

  

您的应用程序不能为特定请求混合使用同步和异步方法。如果调用BeginGetRequestStream方法,则必须使用BeginGetResponse方法来检索响应。