我有一个类别页面(经典 ASP.NET),它从数据库(MS SQL Server)加载产品。每个产品(实现为 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"
有什么建议么?
谢谢你。