2

データを返すために複数のWebサービスを呼び出す必要があるASP.NETページがあります。これらのリクエストを並行して実行したいのですが、PageAsyncTaskクラスを使用するのが最も適切な方法のようです。秘訣は、A、B、C、D、Eなどの5つの呼び出しがあることです。呼び出しAとBは、CとDと同様に、順番に行う必要があります。ABペア、CDペア、およびEはすべて実行できます。並行して。

PageAsyncTaskコンストラクターの「executeInParallel」パラメーターを使用して5つのタスクを作成し、この並列/順次構成を取得できるようには見えません。

3つのタスクを作成してみましたが、そのうち2つは非同期呼び出しを連鎖させています( http://msdn.microsoft.com/en-us/library/dwba7yy7(VS.80).aspxと同様)。PageAsyncTaskのコンテキストでこれを実行しようとすると、end関数を1回しか呼び出せないことを示すエラーが発生します。PageAsyncTaskが使用する関数のペアで3つの関数の連鎖セットをラップしようとしましたが、その結果、end関数が呼び出されることはありません(したがってタイムアウト)。

これを行う良い方法はありますか?

編集:それが便利な場合は、これが私が試みているコードの簡略化されたバージョンであり、end関数は1回しか呼び出せないというエラーが表示されます。

     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
4

1 に答える 1

1

誰かが同じ問題に遭遇した場合、私は呼び出しのチェーンを非同期呼び出しのペアでラップすることに戻ってこの作業を行うことができましたが、次にここに概説されているように私自身のIAsyncResultを実装します:http://msdn.microsoft.com /en-us/magazine/cc163467.aspx

次に、そのメリットが潜在的なメンテナンス/デバッグコストを正当化しないと判断しました。

于 2010-06-11T15:43:17.003 に答える