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"
助言がありますか?
ありがとうございました。