2

我有一个 ASP.NET 页面,它需要调用多个 Web 服务以返回数据。我想并行运行这些请求,并且使用 PageAsyncTask 类似乎是最合适的方法。诀窍是有五个跟注——比如 A、B、C、D 和 E。跟注 A 和 B 必须按顺序进行,C 和 D 也必须如此。AB 对、CD 对和 E 都可以运行在平行下。

看来我不能使用 PageAsyncTask 构造函数的“executeInParallel”参数来创建 5 个任务并获得这种并行/顺序的配置。

我尝试创建 3 个任务,其中两个链接了异步调用(类似于http://msdn.microsoft.com/en-us/library/dwba7yy7(VS.80).aspx)。当我尝试在 PageAsyncTask 的上下文中执行此操作时,我收到一个错误,指示只能调用一次结束函数。我尝试将 3 个函数的链式集合包装在 PageAsyncTask 使用的一对函数中,这导致最终函数永远不会被调用(因此超时)。

有没有好的方法来做到这一点?

编辑:如果它有用,这是我正在尝试的代码的简化版本,并得到了 end 函数只能被调用一次的错误。

     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim objMB As New BusObject.AsyncTasks(AddressOf dummy)
        Dim objTask As New PageAsyncTask(AddressOf objMB.BeginStartSession, AddressOf objMB.EndGetList, Nothing, Nothing, True)
        RegisterAsyncTask(objTask)

        Dim i As Integer = 0
    End Sub

Public Class BusObject
    Public Class AsyncState
        Public SecondCallback As AsyncCallback
    End Class

    Public Class AsyncTasks
        Dim fn_Callback As PageCallback

        Public Delegate Sub PageCallback(ByVal objData As Object)

        Public Sub New(ByVal fnCallback As PageCallback)
            fn_Callback = fnCallback
        End Sub

        Public Function BeginStartSession(ByVal sender As Object, ByVal e As EventArgs, ByVal cb As AsyncCallback, ByVal extraData As Object) As IAsyncResult
            Dim objWS As New com.WebService
            Dim objX As New AsyncState
            objX.SecondCallback = cb
            Return objWS.BeginWSFunction1("param1", "param2", AddressOf EndStartSession, objX)
        End Function

        Public Sub EndStartSession(ByVal objAsyncResult As IAsyncResult)
            Dim objWS As New com.WebService
            Dim strSessionKey As String = objWS.EndWSFunction1(objAsyncResult)
            Dim objState As AsyncState = objAsyncResult.AsyncState

            objWS.BeginWSFunction2("p1", "p2", "p3", "p4", "p5", strSessionKey, True, objState.SecondCallback, objState)

        End Sub

        Public Sub EndGetList(ByVal objState As IAsyncResult)
            Dim objWS As New com.WebService
            Dim objResult As com.WebService.Result = objWS.EndWSFunction2(objState)
            Dim lstReturn As New List(Of BusObject)
            fn_Callback(lstReturn)
        End Sub
    End Class
End Class
4

1 回答 1

1

如果有人遇到同样的问题,我可以通过将我的调用链包装在一对异步调用中来完成这项工作,然后按照此处所述实现我自己的 IAsyncResult:http: //msdn.microsoft.com /en-us/magazine/cc163467.aspx

然后我认为这些好处并不能证明任何潜在的维护/调试成本是合理的。

于 2010-06-11T15:43:17.003 回答