如何关联异步HttpWebRequest和一些回调函数?VB.NET

如何关联异步HttpWebRequest和一些回调函数?VB.NET,vb.net,multithreading,visual-studio,delegates,httpwebrequest,Vb.net,Multithreading,Visual Studio,Delegates,Httpwebrequest,对于异步获取数据, 我在一个通用VB模块中编写了异步Httpwebrequest函数,并在3种以上的表单中编写了获取HTML函数 在模块中: Private Sub GetRequestStreamCallback(ByVal asynchronousResult As IAsyncResult) Dim request As HttpWebRequest = CType(asynchronousResult.AsyncState, HttpWebRequest) Dim p

对于异步获取数据, 我在一个通用VB模块中编写了异步Httpwebrequest函数,并在3种以上的表单中编写了获取HTML函数

在模块中:

Private Sub GetRequestStreamCallback(ByVal asynchronousResult As IAsyncResult) 
    Dim request As HttpWebRequest = CType(asynchronousResult.AsyncState, HttpWebRequest)

    Dim postStream As Stream = request.EndGetRequestStream(asynchronousResult)
    Dim postData As String = <<<<<POST STRING DATA HERE>>>>>
    Dim byteArray As Byte() = System.Text.Encoding.UTF8.GetBytes(postData)

    postStream.Write(byteArray, 0, postData.Length)
    postStream.Close()

    Dim result As IAsyncResult = CType(request.BeginGetResponse(AddressOf GetResponseCallback, request),  _
        IAsyncResult)
End Sub

Private Sub GetResponseCallback(ByVal asynchronousResult As IAsyncResult) 
    Dim request As HttpWebRequest = CType(asynchronousResult.AsyncState, HttpWebRequest)
    Dim response As HttpWebResponse = CType(request.EndGetResponse(asynchronousResult), HttpWebResponse)

    Dim streamResponse As Stream = response.GetResponseStream()
    Dim streamRead As New StreamReader(streamResponse)
    Dim responseString As String = streamRead.ReadToEnd()

    <<<<RETURING THE RECEIVED DATA TO THE FORM WHICH CALLED GETTING HTML FUNC.>>>>

    streamResponse.Close()
    streamRead.Close()

    response.Close()

End Sub

Public Sub GetHTMLAsync(ByVal POSTDATA as String,  <<<<FUNCTION ADDRESS OR SUCH THING TO CALL WHEN THE ASYNC PROCEDURE IS DONE>>>>)

    Req = CType(WebRequest.Create("http://hi.asdf.com/getinformation.php"), HttpWebRequest)
    Req.Method = "POST"
    Req.ContentType = "application/x-www-form-urlencoded; charset=utf-8"
    Req.CookieContainer = CookieC
    Req.Timeout = 1000 * 30

    <DO SOMETHING TO DELIVER [POSTDATA] AND ["FUNCTION" ARGUMENT] TO ASYNC PROCEDURE ABOVE>

    'Async
    Dim result As IAsyncResult = CType(Req.BeginGetRequestStream(AddressOf GetRequestStreamCallback, Req), IAsyncResult)

End Sub
私有子GetRequestStreamCallback(ByVal asynchronousResult作为IAsyncResult)
Dim请求作为HttpWebRequest=CType(asynchronousResult.AsynchState,HttpWebRequest)
Dim postStream As Stream=request.EndGetRequestStream(asynchronousResult)
Dim postData作为字符串=
Dim byteArray As Byte()=System.Text.Encoding.UTF8.GetBytes(postData)
写入(byteArray,0,postData.Length)
postStream.Close()
Dim结果为IAsyncResult=CType(request.BeginGetResponse(GetResponseCallback的地址,request)_
IAsyncResult)
端接头
私有子GetResponseCallback(ByVal asynchronousResult作为IAsyncResult)
Dim请求作为HttpWebRequest=CType(asynchronousResult.AsynchState,HttpWebRequest)
Dim响应为HttpWebResponse=CType(request.EndGetResponse(asynchronousResult),HttpWebResponse)
Dim streamResponse As Stream=response.GetResponseStream()
Dim streamRead作为新的StreamReader(streamResponse)
Dim responseString为String=streamRead.ReadToEnd()
streamResponse.Close()
streamRead.Close()
答复:Close()
端接头
公共子GetHTMLAsync(ByVal POSTDATA作为字符串,)
Req=CType(WebRequest.Create(“http://hi.asdf.com/getinformation.php),HttpWebRequest)
请求方法=“POST”
Req.ContentType=“application/x-www-form-urlencoded;charset=utf-8”
Req.CookieContainer=CookieC
请求超时=1000*30
'异步
作为IAsyncResult=CType的Dim结果(Req.BeginGetRequestStream(GetRequestStreamCallback的地址,Req),IAsyncResult)
端接头
形式如下:

Private Sub btnGet_Click(sender As Object, e As EventArgs) Handles btnGet.Click

  GetHTMLAsync("name=klados&data=birthday", <<<getDataDoneCallBack something..>>>)

End Sub


Public Sub getDataDoneCallBack(ByVal text as String)

  'Show the received data(string)

  Msgbox(text)

End Sub
Private Sub btnGet\u Click(发送者作为对象,e作为事件参数)处理btnGet。单击
GetHTMLAsync(“name=klados&data=birthday”,)
端接头
公共子getDataDoneCallBack(ByVal文本作为字符串)
'显示接收到的数据(字符串)
Msgbox(文本)
端接头
因此,当我调用GetHTMLAsync时,它将POST字符串传递给模块中的async webrequest函数,当接收到响应数据时,它调用表单中的回调函数

这里,我只是想知道 1.如何将POST字符串移交给GetRequestStreamCallback函数? 2.如何从模块中的GetResponseCallback以某种形式回调函数

由于btnGet(调用“GetHTMLAsync”函数)按钮有几种形式,而不是一种形式,因此POST数据和回调函数不应混淆或交叉

我非常感谢你的回答。祝你有愉快的一天

问题摘要 我的问题很简单。使用.NETFramework3.5(无等待函数),我希望生成两个或多个函数(sub),其中包含一个表单.vb(或模块、类)中的独立异步Httpwebrequests。谢谢大家!

调用getHTML(地址、参数、回调函数)

=>使用参数从地址获取信息

=>如果获取数据,则调用回调函数

调用getHTML可以是同步的

getHTML(“,”name=hi“,FUNCTION1)

getHTML(“,“day=happy”,函数2)

应单独工作,不得合并接收数据

如果这有点困难,, 不同的getHTML函数和相同形式的不同回调函数也可以

getHTML_a(“a.com,…)=>回拨gotHTML_a

getHTML_b(“b.com,…)=>回拨gotHTML_b


同样的Form.vb或Module.vb也很棒

这听起来很适合单独使用。每个BackgroundWorker都使用自己的线程独立地执行任务。一旦BackgroundWorker使用事件完成,您就可以传递数据。

如果使用lambda表达式而不是普通函数进行回调,您的代码会简单得多。这样,您将“捕获”需要传递的状态。下面是您的代码的简化示例(VB.NET对我来说不是一种熟悉的语言,因此,如果出现语法问题,我深表歉意):


注意,通过像这样定义
Sub
内联,我可以访问其范围之外的变量。这叫做闭包。因此,
BeginGetRequestStream
的回调可以“查看”
postData
,而
BeginGetResponse
的回调可以“查看”
callback
,所以它可以调用它。

我尝试过这个,但它没有进入
Sub(异步结果2)
。外部函数(BeginGetRequestStream)工作正常,而Req.BeginGetResponse不工作。在调用
BeginGetResponse
之前是否关闭了
postStream
Public Sub GetHTMLAsync(ByVal postData as String, callback as Action(Of String))

    'Req = ...

    Req.BeginGetRequestStream( _
        Sub (asynchronousResult1)
            Dim postStream As Stream = Req.EndGetRequestStream(asynchronousResult1)
            Dim byteArray As Byte() = System.Text.Encoding.UTF8.GetBytes(postData)
            postStream.Write(byteArray, 0, byteArray.Length)
            '...
            Req.BeginGetResponse( _
                Sub (asynchronousResult2)
                    Dim response As HttpWebResponse = Req.EndGetResponse(asynchronousResult2)
                    Dim streamResponse As Stream = response.GetResponseStream()
                    Dim streamRead As New StreamReader(streamResponse)
                    Dim responseString As String = streamRead.ReadToEnd()

                    callback(responseString)

                    '...
                End Sub, Req)
        End Sub, Req)    
End Sub