ASP.NET цепочечные асинхронные вызовы - PullRequest
2 голосов
/ 17 мая 2010

У меня есть страница ASP.NET, которая должна вызывать несколько веб-сервисов для возврата данных. Я хотел бы выполнить эти запросы параллельно, и использование класса PageAsyncTask представляется наиболее подходящим способом сделать это. Хитрость в том, что существует пять вызовов - скажем, A, B, C, D и E. Вызовы A и B должны выполняться последовательно, как и C & D. Пара AB, пара CD и E могут выполняться параллельно.

Не похоже, что я могу использовать параметр executeInParallel конструктора PageAsyncTask, чтобы создать 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

1 Ответ

1 голос
/ 11 июня 2010

Если кто-то сталкивался с той же проблемой, я смог выполнить эту работу, вернувшись к оборачиванию своей цепочки вызовов в пару асинхронных вызовов, но затем реализовав свой собственный IAsyncResult, как описано здесь: http://msdn.microsoft.com/en-us/magazine/cc163467.aspx

Тогда я решил, что преимущества не оправдывают никаких потенциальных затрат на обслуживание / отладку.

...