Les applications qui peuvent effectuer une autre tâche en attendant les résultats d'une opération asynchrone ne doivent pas bloquer l'attente jusqu'à la fin de l'opération. Utilisez l'une des options suivantes pour continuer à exécuter les instructions en attendant la fin d'une opération asynchrone :
-
Utilisez un délégué AsyncCallback pour traiter les résultats de l'opération asynchrone dans un thread séparé. Cette approche est présentée dans cette rubrique.
-
Utilisez la propriété IsCompleted du IAsyncResult retourné par la méthode BeginOperationName de l'opération asynchrone pour déterminer si l'opération est terminée. Pour obtenir un exemple illustrant cette approche, consultez Interrogation de l'état d'une opération asynchrone.
Exemple
L'exemple de code suivant illustre l'utilisation de méthodes asynchrones dans la classe Dns afin de récupérer les informations du système de noms de domaines (DNS, Domain Name System) pour des ordinateurs spécifiés par l'utilisateur. Cet exemple crée un délégué AsyncCallback qui fait référence à la méthode ProcessDnsInformation. Cette méthode est appelée une fois pour chaque demande asynchrone d'informations DNS.
Notez que l'hôte spécifié par l'utilisateur est passé au paramètre BeginGetHostByName Object. Pour obtenir un exemple présentant la définition et l'utilisation d'un objet état plus complexe, consultez Utilisation d'un délégué AsyncCallback et objet d'état.
'The following example demonstrates using asynchronous methods to 'get Domain Name System information for the specified host computers. 'This example uses a delegate to obtain the results of each asynchronous 'operation. Imports System Imports System.Net Imports System.Net.Sockets Imports System.Threading Imports System.Collections.Specialized Imports System.Collections Namespace Examples.AdvancedProgramming.AsynchronousOperations Public Class UseDelegateForAsyncCallback Dim Shared requestCounter as Integer Dim Shared hostData as ArrayList = new ArrayList() Dim Shared hostNames as StringCollection = new StringCollection() Shared Sub UpdateUserInterface() ' Print a message to indicate that the application ' is still working on the remaining requests. Console.WriteLine("{0} requests remaining.", requestCounter) End Sub Public Shared Sub Main() ' Create the delegate that will process the results of the ' asynchronous request. Dim callBack as AsyncCallback Dim host as string Dim i, j, k as Integer callback = AddressOf ProcessDnsInformation Do Console.Write(" Enter the name of a host computer or <enter> to finish: ") host = Console.ReadLine() If host.Length > 0 ' Increment the request counter in a thread safe manner. Interlocked.Increment(requestCounter) ' Start the asynchronous request for DNS information. Dns.BeginGetHostEntry(host, callBack, host) End If Loop While (host.Length > 0) ' The user has entered all of the host names for lookup. ' Now wait until the threads complete. Do While requestCounter > 0 UpdateUserInterface() Loop ' Display the results. For i = 0 To hostNames.Count -1 Dim dataObject as Object = hostData (i) Dim message as String ' Was a SocketException was thrown? If TypeOf dataObject is String message = CType(dataObject, String) Console.WriteLine("Request for {0} returned message: {1}", _ hostNames(i), message) Else ' Get the results. Dim h as IPHostEntry = CType(dataObject, IPHostEntry) Dim aliases() as String = h.Aliases Dim addresses() as IPAddress = h.AddressList If aliases.Length > 0 Console.WriteLine("Aliases for 0}", hostNames(i)) For j = 0 To aliases.Length -1 Console.WriteLine("{0}", aliases(j)) Next j End If If addresses.Length > 0 Console.WriteLine("Addresses for {0}", hostNames(i)) For k = 0 To addresses.Length -1 Console.WriteLine("{0}",addresses(k).ToString()) Next k End If End If Next i End Sub ' The following method is called when each asynchronous operation completes. Shared Sub ProcessDnsInformation(result as IAsyncResult) Dim hostName as String = CType(result.AsyncState, String) hostNames.Add(hostName) Try ' Get the results. Dim host as IPHostEntry = Dns.EndGetHostEntry(result) hostData.Add(host) ' Store the exception message. Catch e as SocketException hostData.Add(e.Message) Finally ' Decrement the request counter in a thread-safe manner. Interlocked.Decrement(requestCounter) End Try End Sub End Class End Namespace
/* The following example demonstrates using asynchronous methods to get Domain Name System information for the specified host computers. This example uses a delegate to obtain the results of each asynchronous operation. */ using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Collections.Specialized; using System.Collections; namespace Examples.AdvancedProgramming.AsynchronousOperations { public class UseDelegateForAsyncCallback { static int requestCounter; static ArrayList hostData = new ArrayList(); static StringCollection hostNames = new StringCollection(); static void UpdateUserInterface() { // Print a message to indicate that the application // is still working on the remaining requests. Console.WriteLine("{0} requests remaining.", requestCounter); } public static void Main() { // Create the delegate that will process the results of the // asynchronous request. AsyncCallback callBack = new AsyncCallback(ProcessDnsInformation); string host; do { Console.Write(" Enter the name of a host computer or <enter> to finish: "); host = Console.ReadLine(); if (host.Length > 0) { // Increment the request counter in a thread safe manner. Interlocked.Increment(ref requestCounter); // Start the asynchronous request for DNS information. Dns.BeginGetHostEntry(host, callBack, host); } } while (host.Length > 0); // The user has entered all of the host names for lookup. // Now wait until the threads complete. while (requestCounter > 0) { UpdateUserInterface(); } // Display the results. for (int i = 0; i< hostNames.Count; i++) { object data = hostData [i]; string message = data as string; // A SocketException was thrown. if (message != null) { Console.WriteLine("Request for {0} returned message: {1}", hostNames[i], message); continue; } // Get the results. IPHostEntry h = (IPHostEntry) data; string[] aliases = h.Aliases; IPAddress[] addresses = h.AddressList; if (aliases.Length > 0) { Console.WriteLine("Aliases for {0}", hostNames[i]); for (int j = 0; j < aliases.Length; j++) { Console.WriteLine("{0}", aliases[j]); } } if (addresses.Length > 0) { Console.WriteLine("Addresses for {0}", hostNames[i]); for (int k = 0; k < addresses.Length; k++) { Console.WriteLine("{0}",addresses[k].ToString()); } } } } // The following method is called when each asynchronous operation completes. static void ProcessDnsInformation(IAsyncResult result) { string hostName = (string) result.AsyncState; hostNames.Add(hostName); try { // Get the results. IPHostEntry host = Dns.EndGetHostEntry(result); hostData.Add(host); } // Store the exception message. catch (SocketException e) { hostData.Add(e.Message); } finally { // Decrement the request counter in a thread-safe manner. Interlocked.Decrement(ref requestCounter); } } } }
Outils (masquer)
S'enregistrer
Liste des Membres
Qui est en ligne?
FAQ