Synchronous Versus Asynchronous Calls

338 asyncState End Function System.Diagnostics.DebuggerStepThroughAttribute _ Public Function EndSayHello _ ByVal asyncResult As System.IAsyncResult _ As String Dim results As Object = Me.EndInvokeasyncResult Return CTyperesults0,String End Function End Class After creating the proxy class, write client code to make use of it. Using the proxy class is just like using any other .NET class. The proxy class hides method calls being forwarded over the Web. Ex am ple 7- 3 shows code that uses the proxy class from Ex am ple 7- 2 . Example 7-3. Client code for use with Ex a m ple 7 - 2 Imports System Public Module SomeApplication Public Sub Main Dim myService As New HelloWebService Console.WriteLinemyService.SayHelloAnnemarie End Sub End Module Note that the client code simply instantiates the proxy class and calls its SayHello method. Lastly, compile the proxy class and the client code together. Heres an example of compiling from the command line note that this should be entered as a single command and is shown on two lines here only for printing in this book: vbc SomeApplication.vb HelloWebService.vb reference:System.Web.Services.dll,System.Xml.dll,System.dll The three assemblies referenced in this command are required by the proxy class.

7.4.3 Synchronous Versus Asynchronous Calls

Web-method calls are synchronous by default. That is, the caller waits while the call is sent over the network and while the result is calculated and sent back. When dealing with the Internet, this can be a lengthy process a fraction of a second to several seconds. There are times when it would be useful for the client to go off and perform some other processing while waiting for the web method to complete. Fortunately, the autogenerated proxy class created by either Visual Studio .NET or wsdl.exe provides a way to do this. Ex am ple 7- 4 shows client code that calls the SayHello web method asynchronously. Example 7-4. Calling SayHello asynchronously Private myService As New HelloWebService Private Sub btnInvoke_Click _ ByVal sender As System.Object, _ ByVal e As System.EventArgs _ Handles btnInvoke.Click Assumes that there is a text box named txtName. myService.BeginSayHellotxtName.Text, AddressOf MySayHelloCallback, _ Nothing 339 End Sub Private Sub MySayHelloCallbackByVal ar As IAsyncResult Assumes that there is a text box named txtResult. txtResult.Text = myService.EndSayHelloar End Sub For each web method, the web-service proxy class exposes two additional methods, named Begin WebMethodName and End WebMethodName , where WebMethodName is the name of the web method to be invoked. The purpose of the Begin WebMethodName method is to invoke the web method and immediately return. This allows client code to continue executing while the web service processes the request. When the response arrives from the web service, it is held until the client calls the End WebMethodName method. If the client calls the End WebMethodName method before the web methods response arrives, the client blocks until the response arrives. If the client calls the End WebMethodName method after the response arrives, the method immediately returns with the response value. The parameters of the Begin WebMethodName method are exactly the same as the parameters of the web-method call itself, plus two additional parameters: callback If the client would like to be notified when the web methods response has arrived, it can pass a delegate reference in this parameter. The type of this parameter is AsyncCallback, which is defined in the System namespace as: Public Delegate Sub AsyncCallbackByVal ar As IAsyncResult To pass a callback function to the Begin WebMethodName method, write a method having the appropriate signature and then use the AddressOf operator to create a delegate from that method, as shown in Ex am ple 7- 4 . If the client does not want to be notified when the web methods response has arrived, it can pass Nothing in this parameter. asyncState If the client would like to provide some arbitrary additional information to the callback function, it can do so by assigning a value to the asyncState parameter. This parameter is of type Object, so any value can be passed. The value passed in this parameter is passed on to the callback function when the web-method call returns. If no additional information needs to be passed to the callback function, pass Nothing in this parameter. The Begin WebMethodName method has no return value. When the callback function is called, it receives a reference to an object that implements IAsyncResult defined in the System namespace. The AsyncState property of this object holds the value passed in the asyncState parameter of the Begin Web - MethodName method. The first parameter of the End WebMethodName method is the IAsyncResult reference obtained in the callback function. Alternatively, the client can pass Nothing in this parameter if not using a callback function. The End WebMethodName method may have additional parameters, depending on whether the corresponding web method has any ByRef parameters. If there are any such parameters, they appear here in the signature of the End WebMethodName method. In addition, the return value of the End WebMethodName method is the return value of the web method. 340

7.5 Web-Service Discovery