У меня есть страница 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