0

DB (MS SQL Server) から製品をロードするカテゴリ ページ (Classic ASP.NET) があります。各製品 (userControl として実装) には、独自のデータバインドされたコントロールがあります。これらの製品コントロールを並行してロードしたいので、PageAsyncTask を作成して登録するヘルパー モジュールを作成しました。

Public Module AsyncHelper

Public Delegate Sub AsyncDeleg()

Private Function OnBegin(sender As Object, e As EventArgs, cb As AsyncCallback, state As Object) As IAsyncResult
    Return DirectCast(state, AsyncDeleg).BeginInvoke(cb, state)
End Function

Private Sub OnEnd(ar As IAsyncResult)
    Try
        DirectCast(ar.AsyncState, AsyncDeleg).EndInvoke(ar)
        HttpContext.Current.Trace.Write("OnEnd", ar.CompletedSynchronously)
    Catch ex As Exception
        DirectCast(ar.AsyncState, AsyncDeleg).Invoke()
        HttpContext.Current.Trace.Write("OnEnd", ex.Message)
    End Try
End Sub

Public Sub RunAsyncTask(pg As Web.UI.Page, subToRun As AsyncDeleg)
    pg.RegisterAsyncTask(New PageAsyncTask(AddressOf OnBegin, AddressOf OnEnd, Nothing, subToRun, True))
End Sub

End Module

UserControl からの呼び出しは非常に単純です。

AsyncHelper.RunAsyncTask(Me.Page, New AsyncHelper.AsyncDeleg(AddressOf BindData))

Sub BindData は DB にクエリを実行し、結果をリピーターまたは ListView にバインドします。

実際には並行して動作しますが、Control not found Stack emptyのような例外が発生することがあります

この目的のために、OnEnd の catch は正常に機能します。

さらに悪いことに正しい製品からデータを取得し、エラーなしでランダムな製品からデータを取得することがあります;(

技術的な詳細:
.NET 4.5
httpRuntime targetFramework="4.5"
<%@ Page Async="true"

助言がありますか?
ありがとうございました。

4

0 に答える 0