Compartilhar via


Bloqueando aplicativo execução com uma AsyncWaitHandle

Aplicativos que não podem continuar a fazer Outros trabalho enquanto espera para os resultados de uma operação assíncrono devem bloco até que a operação seja concluída.Use uma das seguintes opções para bloco thread principal do aplicativo durante a espera de uma operação assíncrono concluir:

Aplicativos que usam um ou mais WaitHandle objetos para bloco até que uma operação assíncrono seja concluída normalmente chamará o ComeçarOperationName método, executar qualquer trabalho que pode ser concluído sem resultados da operação e, em seguida, bloco até que as operações assíncrono seja concluída.Um aplicativo pode bloco em uma única operação chamando um o WaitOne métodos usando o AsyncWaitHandle. Para bloco enquanto aguarda a um conjunto de operações assíncrono para concluir, armazenar o associado AsyncWaitHandle objetos em uma matriz e telefonar da WaitAll métodos. Para bloquear enquanto aguarda a qualquer um de um conjunto de operações assíncrono para concluir, armazene o associado AsyncWaitHandle objetos em uma matriz e telefonar da WaitAny métodos.

Exemplo

Sistema de Nomes de Domínio exemplo de código a seguir demonstra Sistema de Nomes de Domínio uso de métodos assíncrono na classe Sistema de Nomes de Domínio para recuperar informações de Sistema de Nomes de Domínio para um computador especificado pelo usuário.O exemplo demonstra o bloqueio usando o WaitHandle associado com a operação assíncrono. Note that null (Nothing in Visual Basic) is passed for the BeginGetHostByNamerequestCallback and stateObject parameters because these are not required when using this approach.

' The following example demonstrates using asynchronous methods to
' get Domain Name System information for the specified host computer.

Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

namespace Examples.AdvancedProgramming.AsynchronousOperations
    Public Class WaitUntilOperationCompletes

        Public Shared Sub Main(args() as String)
            ' Make sure the caller supplied a host name.
            If(args.Length = 0)
                ' Print a message and exit.
                Console.WriteLine("You must specify the name of a host computer.")
                End
            End If
            ' Start the asynchronous request for DNS information.
            Dim result as IAsyncResult= Dns.BeginGetHostEntry(args(0), Nothing, Nothing)
            Console.WriteLine("Processing request for information...")
            ' Wait until the operation completes.
            result.AsyncWaitHandle.WaitOne()
            ' The operation completed. Process the results.
            Try 
                ' Get the results.
                Dim host as IPHostEntry = Dns.EndGetHostEntry(result)
                Dim  aliases() as String = host.Aliases
                Dim addresses() as IPAddress= host.AddressList
                Dim i as Integer
                If aliases.Length > 0
                    Console.WriteLine("Aliases")
                    For i = 0 To aliases.Length -1 
                        Console.WriteLine("{0}", aliases(i))
                    Next i
                End If
                If addresses.Length > 0
                    Console.WriteLine("Addresses")
                    For i = 0 To addresses.Length -1
                        Console.WriteLine("{0}", addresses(i).ToString())
                    Next i
                End If
            Catch e as SocketException
                  Console.WriteLine("An exception occurred while processing the request: {0}" _
                    , e.Message)
            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 computer.

*/

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Examples.AdvancedProgramming.AsynchronousOperations
{
    public class WaitUntilOperationCompletes
    {
        public static void Main(string[] args)
        {
            // Make sure the caller supplied a host name.
            if (args.Length == 0 || args[0].Length == 0)
            {
                // Print a message and exit.
                Console.WriteLine("You must specify the name of a host computer.");
                return;
            }
            // Start the asynchronous request for DNS information.
            IAsyncResult result = Dns.BeginGetHostEntry(args[0], null, null);
            Console.WriteLine("Processing request for information...");
            // Wait until the operation completes.
            result.AsyncWaitHandle.WaitOne();
            // The operation completed. Process the results.
            try 
            {
                // Get the results.
                IPHostEntry host = Dns.EndGetHostEntry(result);
                string[] aliases = host.Aliases;
                IPAddress[] addresses = host.AddressList;
                if (aliases.Length > 0)
                {
                    Console.WriteLine("Aliases");
                    for (int i = 0; i < aliases.Length; i++)
                    {
                        Console.WriteLine("{0}", aliases[i]);
                    }
                }
                if (addresses.Length > 0)
                {
                    Console.WriteLine("Addresses");
                    for (int i = 0; i < addresses.Length; i++)
                    {
                        Console.WriteLine("{0}",addresses[i].ToString());
                    }
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("Exception occurred while processing the request: {0}", 
                    e.Message);
            }
        }
    }
}

Consulte também

Conceitos

padrão assíncrono baseado em evento Visão geral sobre

Outros recursos

Padrões de design de programação assíncrono