2010-05-17 77 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

然后我决定没有任何可能的维护/调试成本的合理利益。