PageAsyncTask混乱线程

时间:2016-04-15 19:34:42

标签: asp.net multithreading pageasynctask

我有一个类别页面(Classic ASP.NET),它从DB(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。

它实际上是并行工作但有时它会产生异常 控制未找到 堆栈空

为此目的,OnEnd中的捕获工作正常。

更糟糕的是,有时它从正确的产品中获取部分数据,从任何随机产品中获取部分数据而没有任何错误;(

技术细节:
.NET 4.5
httpRuntime targetFramework =" 4.5"
<%@ Page Async =" true"

有什么建议吗? 谢谢。

0 个答案:

没有答案