0

私はASP.net(VB)の完全な初心者です。経験豊富なメンバーにとって質問が明白すぎる場合は、ご容赦ください。

ターゲットURLがデータを提供するのに時間がかかる場合に備えて、非同期モードで単純なWebRequestを作成しようとしました。以下のコードでは、コールバックブロック(RespCallback)が毎回正しく呼び出されるかどうかを確認したいだけです。すべてがうまくいけば、「GetData」サブを呼び出すボタンをクリックするたびに、lblResultに文字列「123」が追加されているはずです。

ただし、lblResultには、最初のクリック後にのみ123が表示されます。その後のクリック後、RespCallbackが呼び出されないかのように、lblResultには「12」が追加されるだけです。Visual Studioでこれをデバッグしようとすると、実行は実際にはRespCallback部分に直接ステップインし、lblResult.Textウォッチは実際には「123123」を表示しますが、結果のWebページは常に「12312」のみを表示します。

ここでは基本的なものが欠けていると思いますが、何がわからないのです。私はそれがブラウザのキャッシュに関係しているとさえ推測していました(したがって、結果は2回目に変更されます)が、それを修正する方法もわかりません。

誰か助けてもらえますか?前もって感謝します。

ジム

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

4

2 に答える 2

0

チェックするカップルの事柄:

  1. ラベルの幅が固定されている場合は、テキストがクリップされている可能性があります
  2. UpdatePanelを使用している場合は、モードを「条件付き」に設定Update()し、RespCallbackコールバックメソッドで呼び出して、UIが最新のラベルテキスト値で更新されるようにする必要があります。
于 2012-05-28T17:03:05.653 に答える
0

私はVBを知らないので、私には読みにくいですGetDataが、あなたのonClickハンドラーだと思います。

Shared最初に正しくないのは、メンバーがいるということです。なぜリセットイベントなのですSharedか?すべてのリクエストで同じオブジェクトを使用します。基本的ManualResetEventに、最初の後にオブジェクトが設定されたままになるため、コードは機能しませんallDone.Set()(Webアプリケーションが存続している限り)。allDone.Reset()の後に追加する必要があるたびに「123」を取得するにはallDone.WaitOne()RespCallbackあなたの状況では、最初の呼び出しを除いて毎回呼び出される 前にWeb要求がクライアントに返されます(リセットイベントがシグナルされていない状態の場合)。AutoResetEvent自動的にリセットされます。それがうまくいった理由です。

だが!この方法でこれを行うことはできません。ResetEvent Sharedすべてのリクエストで同じオブジェクトを使用するようにします。複数のリクエストがアプリケーションによって同時に処理される場合、未確定の動作が発生します。

コードからSharedを削除します。あなたのコードはallDone.Reset()とAutoResetEventなしで(非同期ではなく)動作します。ただし、既知の結果が得られます(リクエストの量には依存しません)。

非同期呼び出しについて(コードが「機能している」ようになりました)。上手。Webページへの非同期リクエストはありません。allDone.WaitOne()非同期webRequestが終了するまで待機します。したがって、基本的には同期要求を行うこともできます。

非同期Webページには特別なパターンが必要です。ここでこれを行う方法を読むことができます。

しかし、それがあなたが望んでいたものかどうかはわかりません。サーバーリソースを使用しないようにリクエストを非同期で呼び出すか、Webページが完全に責任を負っている間にユーザーにメッセージ(「データがダウンロードされています...」など)を表示しますか?

2番目の場合は、AJAX機能を使用する必要があります(UpdatePanelJavaScriptのようにまたは直接使用します)。あなたはここでそれについて読むことができます。

于 2012-05-29T17:38:10.233 に答える