2010-05-17 80 views
2

我有一個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 
+0

我認爲,不要追求這個,你應該看看爲什麼客戶需要提出5個請求。爲什麼不能在一次往返中完成?這對客戶來說會是一個更好的體驗,尤其是那些高延遲的客戶。 – 2010-05-17 15:05:22

+0

部分原因是AB,CD和E呼叫是針對三種不同的網絡服務。在某些情況下,AB對是我無法控制的Web服務,它的設計使得呼叫A進行身份驗證,並且調用B返回數據。在其他情況下,我已經測試並發現分成兩個調用是更高效的。 – joelt 2010-05-17 15:24:39

回答

1

如果有人在同樣的問題上運行,我能夠回到包裹我的電話的鏈在一對異步調用的,但後來實施我自己的IAsyncResult,使這項工作所概述的位置:http://msdn.microsoft.com/en-us/magazine/cc163467.aspx

然後我決定沒有任何可能的維護/調試成本的合理利益。