0

我有一个类别页面(经典 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"

有什么建议么?
谢谢你。

4

0 回答 0