我有一個ASP.NET頁面需要調用多個Web服務來返回數據。我想同時運行這些請求,並且使用PageAsyncTask類似乎是最合適的方式。訣竅是有五個呼叫 - 比如A,B,C,D和E.呼叫A必須按順序進行,必須如同C & D. AB對,CD對和E都可以運行在平行下。ASP.NET鏈接異步調用
似乎沒有我可以使用PageAsyncTask構造函數的「executeInParallel」參數來創建5個任務並獲得並行/順序的此配置。
我試過創建3個任務,其中兩個鏈接異步調用(類似於http://msdn.microsoft.com/en-us/library/dwba7yy7(VS.80).aspx)。當我嘗試在PageAsyncTask的上下文中這樣做時,我得到一個錯誤,指出只能調用一次結束函數。我試着將一組鏈接的3個函數包裝在PageAsyncTask使用的一對函數中,並且導致最終函數永遠不會被調用(因此超時)。
有沒有很好的方法來做到這一點?
編輯:如果它很有用,這裏是我嘗試的代碼的簡化版本,並得到錯誤,只能調用一次結束函數。
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
我認爲,不要追求這個,你應該看看爲什麼客戶需要提出5個請求。爲什麼不能在一次往返中完成?這對客戶來說會是一個更好的體驗,尤其是那些高延遲的客戶。 – 2010-05-17 15:05:22
部分原因是AB,CD和E呼叫是針對三種不同的網絡服務。在某些情況下,AB對是我無法控制的Web服務,它的設計使得呼叫A進行身份驗證,並且調用B返回數據。在其他情況下,我已經測試並發現分成兩個調用是更高效的。 – joelt 2010-05-17 15:24:39