AsyncCallback Delegat

Definicja

Odwołuje się do metody, która ma zostać wywołana po zakończeniu odpowiedniej operacji asynchronicznej.

C#
public delegate void AsyncCallback(IAsyncResult ar);
C#
[System.Serializable]
public delegate void AsyncCallback(IAsyncResult ar);
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public delegate void AsyncCallback(IAsyncResult ar);

Parametry

ar
IAsyncResult

Wynik operacji asynchronicznej.

Atrybuty

Przykłady

Poniższy przykład kodu przedstawia użycie metod asynchronicznych w Dns klasie w celu pobrania informacji systemu nazw domen (DNS) dla komputerów określonych przez użytkownika. W tym przykładzie tworzony jest AsyncCallback delegat, który odwołuje się do ProcessDnsInformation metody . Ta metoda jest wywoływana raz dla każdego asynchronicznego żądania informacji DNS.

C#
/*
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);
            }
        }
    }
}

Uwagi

Użyj delegata AsyncCallback , aby przetworzyć wyniki operacji asynchronicznej w osobnym wątku. Delegat AsyncCallback reprezentuje metodę wywołania zwrotnego wywoływaną po zakończeniu operacji asynchronicznej. Metoda wywołania zwrotnego IAsyncResult przyjmuje parametr , który jest następnie używany do uzyskiwania wyników operacji asynchronicznej.

Aby uzyskać więcej informacji na temat programowania asynchronicznego, zobacz Using an AsyncCallback Delegate to End an Asynchronous Operation and Using an AsyncCallback Delegate and State Object in Event-based Asynchronous Pattern (EAP) (Używanie delegata AsyncCallback do zakończenia operacji asynchronicznej oraz Używanie delegata AsyncCallback i obiektu stanu w asynchronicznym wzorcu asynchronicznym opartym na zdarzeniach (EAP).

Metody rozszerzania

GetMethodInfo(Delegate)

Pobiera obiekt reprezentujący metodę reprezentowaną przez określonego delegata.

Dotyczy

Produkt Wersje
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Zobacz też