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:
Use o AsyncWaitHandle propriedade das IAsyncResult retornados pela operação assíncrono ComeçarMétodo de OperationName.Essa abordagem é demonstrada neste tópico.
telefonar participanteMétodo de OperationName.Para obter um exemplo que demonstra essa abordagem, consulte Bloqueando a execução do aplicativo ao final de uma operação assíncrono.
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