How to: Chain Asynchronous Calls with a Web Service Method
The following code example demonstrates how to chain asynchronous calls when a Web service method makes more than one asynchronous call and the calls must execute sequentially. The BeginGetAuthorRoyalties method makes an asynchronous call to determine whether the author passed in is valid and sets up an intermediate callback named AuthorRoyaltiesCallback to receive the results. That intermediate callback then asynchronously calls to get the royalties for that author, if the author is valid.
Imports System.Web.Services Imports System.Data Imports System ' This imports the proxy class for the Web services ' that the sample communicates with. Imports AsyncWS_VB.localhost Namespace AsyncWs <WebService(Namespace:="http://www.contoso.com/")> _ Public Class MyService Inherits WebService Public remoteService As remoteService Public Sub New() MyBase.New() remoteService = New localhost.RemoteService() End Sub ' Defines the Begin method. <WebMethod()> _ Public Function BeginGetAuthorRoyalties(ByVal Author As String, _ ByVal callback As AsyncCallback, ByVal asyncState As Object) _ As IAsyncResult ' Saves the current state for the call that gets the author's ' royalties. Dim state As AsyncStateChain = New AsyncStateChain() state.originalState = asyncState state.Author = Author state.originalCallback = callback ' Creates an intermediary callback. Dim chainedCallback As AsyncCallback = New AsyncCallback( _ AddressOf AuthorRoyaltiesCallback) ' Begin asynchronous communictation with a different XML Web ' service. Return remoteService.BeginGetAuthors(chainedCallback, state) End Function ' Intermediate method to handle chaining the asynchronous calls. Public Sub AuthorRoyaltiesCallback(ByVal ar As IAsyncResult) Dim state As AsyncStateChain = CType(ar.AsyncState, _ AsyncStateChain) Dim rs As RemoteService = New RemoteService() ' Gets the result from the call to GetAuthors. Dim allAuthors As Authors = rs.EndGetAuthors(ar) Dim found As Boolean = False ' Verifies that the requested author is valid. Dim i As Integer = 0 Dim row As DataRow While (i < allAuthors.authors.Rows.Count And (Not found)) row = allAuthors.authors.Rows(i) If (row("au_lname").ToString() = state.Author) Then found = True End If i = i + 1 End While If (found) Then Dim cb As AsyncCallback = state.originalCallback ' Calls the second Web service, because the author is ' valid. rs.BeginReturnedStronglyTypedDS(state.Author, cb, state) Else ' Cannot throw the exception in this function or the XML Web ' service will hang. So, set the state argument to the ' exception and let the End method of the chained XML Web ' service check for it. Dim ex As ArgumentException = New ArgumentException( _ "Author does not exist.", "Author") Dim cb As AsyncCallback = state.originalCallback ' Call the second Web service, setting the state to an ' exception. rs.BeginReturnedStronglyTypedDS(state.Author, cb, ex) End If End Sub ' Define the End method. <WebMethod()> _ Public Function EndGetAuthorRoyalties(ByVal asyncResult As _ IAsyncResult) As localhost.AuthorRoyalties ' Return the asynchronous result from the other Web service. Return remoteService.EndReturnedStronglyTypedDS(asyncResult) End Function End Class ' Class to wrap the callback and state for the intermediate asynchronous ' operation. Public Class AsyncStateChain Public originalCallback As AsyncCallback Public originalState As Object Public Author As String End Class End Namespace