WebRequest的异步回调代码只得到第一时间致电(WebRequest Async CallBa

2019-10-30 03:54发布

我在ASP.net绝对初学者(VB)。请原谅我,如果这个问题是针对有经验的成员太明显了。

我试图做一个简单的WebRequest在情况下,目标URL需要较长提供的数据异步模式。 在下面我的代码,我只是想看看如果回调块(RespCallback)每一次都被正确调用。 如果一切顺利,lblResult应该有我点击它调用“的GetData”子键,每次追加到它的字符串“123”。

然而,lblResult只显示首次点击后,123。 随后点击后,lblResult仅获取与“12”附加,仿佛RespCallback不会被调用。 当我试图在Visual Studio调试此,执行真正加强对进入RespCallback部分和lblResult.Text看实际显示“123123”,但所产生的网页始终只显示“12312”

我相信,我失去了一些东西基本在这里,但我只是不知道是什么。 我甚至猜测,它与浏览器缓存(因此第二次结果的变化)这样做,但我不知道如何解决,要么。

是否有人可以帮助? 提前致谢。

吉姆

Dim myWebRequest As WebRequest

Public Shared allDone As New ManualResetEvent(False)
Private Shared BUFFER_SIZE As Integer = 1024

Public Class RequestState
    ' This class stores the state of the request
    Private Shared BUFFER_SIZE As Integer = 1024
    Public requestData As StringBuilder
    Public bufferRead() As Byte
    Public request As WebRequest
    Public response As WebResponse
    Public responseStream As Stream

    Public Sub New()
        bufferRead = New Byte(BUFFER_SIZE) {}
        requestData = New StringBuilder("")
        request = Nothing
        responseStream = Nothing
    End Sub ' New
End Class ' RequestState

Public Sub GetData(Sender As Object, Args As System.EventArgs)
    lblResult.Text += "1"
    myWebRequest = WebRequest.Create(dataURL)

    Dim myRequestState As New RequestState()

    myRequestState.request = myWebRequest

    ' Start the asynchronous request.
    Dim asyncResult As IAsyncResult = CType(myWebRequest.BeginGetResponse(AddressOf RespCallback, myRequestState), IAsyncResult)


    lblResult.Text += "2"
    allDone.WaitOne()

End Sub

Private Sub RespCallback(asynchronousResult As IAsyncResult)
    lblResult.Text += "3"
    allDone.Set()
End Sub

Answer 1:

我不知道VB的,所以很难阅读对我来说,但我怀疑GetData是你onClick处理程序。

这是不对的第一件事情是,你必须Shared成员。 为什么你的重置事件被Shared ? 它使所有的请求使用相同的对象。 基本上你的代码ManualResetEvent将无法正常工作首先是因为后allDone.Set()你的对象保持集(只要Web应用程序的生命)。 为了得到“123”每次你应该添加allDone.Reset()allDone.WaitOne() 在之前,你的情况Web请求返回到客户端RespCallback被称为除第一次调用每次(当你的复位事件是在无信号状态)。 AutoResetEvent自动复位。 这就是为什么它的工作。

但! 你不能做到这一点这样。 让您的ResetEvent Shared你让所有的请求使用相同的对象。 当有多个请求,将您的应用程序在同一时间处理你会得到不确定的行为。

从您的代码共享。 比你的代码就可以了(但不是异步)无allDone.Reset()和无的AutoResetEvent。 但是,这(不依赖于请求量)提供已知的结果。

关于异步调用(现在我们已经码“工作”)。 好。 没有异步请求到您的网页。 allDone.WaitOne()等待您的异步的WebRequest完成。 所以基本上你也可以同样做同步请求。

你需要异步Web页面的特定模式。 你可以阅读如何做到这一点在这里 。

但我不知道这是你想要的。 你想让你的请求被异步调用,这样就不会使用服务器资源,或者你想显示一些信息给用户(如“数据正在下载...”),而您的网页将继续全面负责?

如果是第二个,你应该使用AJAX功能(像UpdatePanel或者直接使用JavaScript)。 你可以阅读一下这里 。



Answer 2:

几件事情要检查:

  1. 如果您的标签是一个固定的宽度,那么它可能文本被修剪
  2. 如果您正在使用一个UpdatePanel,你需要它的模式设置为“有条件的”,并呼吁Update()这样的UI获取与最新的标签文本值刷新就可以在RespCallback回调方法。


文章来源: WebRequest Async CallBack Code only gets call the first time