我有一些代码可以迭代几个网址并从网上请求数据。
它看起来像这样
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
感谢您的帮助和建议。感谢
答案 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方法来检索响应。