Toepassingsuitvoering blokkeren met behulp van een AsyncWaitHandle
Toepassingen die niet verder kunnen werken terwijl ze wachten op de resultaten van een asynchrone bewerking, moeten worden geblokkeerd totdat de bewerking is voltooid. Gebruik een van de volgende opties om de hoofdthread van uw toepassing te blokkeren terwijl u wacht tot een asynchrone bewerking is voltooid:
Gebruik de eigenschap AsyncWaitHandle van de IAsyncResult die wordt geretourneerd door de asynchrone bewerking van de methode OperationName. Deze benadering wordt in dit onderwerp gedemonstreerd.
Roep de methode EndOperationName van de asynchrone bewerking aan. Zie Toepassingsuitvoering blokkeren door een Asynchrone bewerking te beëindigenvoor een voorbeeld dat deze aanpak laat zien.
Toepassingen die een of meer WaitHandle objecten gebruiken om te blokkeren totdat een asynchrone bewerking is voltooid, roepen doorgaans de methode BeginOperationName aan, voer alle werkzaamheden uit die zonder de resultaten van de bewerking kunnen worden uitgevoerd en blokkeren totdat de asynchrone bewerking(en) is voltooid. Een toepassing kan één bewerking blokkeren door een van de WaitOne methoden aan te roepen met behulp van de AsyncWaitHandle. Als u wilt blokkeren terwijl u wacht tot een set asynchrone bewerkingen is voltooid, slaat u de bijbehorende AsyncWaitHandle objecten op in een matrix en roept u een van de WaitAll methoden aan. Als u wilt blokkeren terwijl u wacht tot een van een set asynchrone bewerkingen is voltooid, slaat u de bijbehorende AsyncWaitHandle objecten op in een matrix en roept u een van de WaitAny methoden aan.
Voorbeeld
In het volgende codevoorbeeld ziet u hoe u asynchrone methoden in de DNS-klasse gebruikt om domain name system-informatie op te halen voor een door de gebruiker opgegeven computer. In het voorbeeld wordt het blokkeren gedemonstreerd met behulp van de WaitHandle die aan de asynchrone bewerking is gekoppeld. Houd er rekening mee dat null
(Nothing
in Visual Basic) wordt doorgegeven voor de parameters BeginGetHostByNamerequestCallback
en stateObject
, omdat deze niet vereist zijn bij het gebruik van deze methode.
/*
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($"{aliases[i]}");
}
}
if (addresses.Length > 0)
{
Console.WriteLine("Addresses");
for (int i = 0; i < addresses.Length; i++)
{
Console.WriteLine($"{addresses[i].ToString()}");
}
}
}
catch (SocketException e)
{
Console.WriteLine($"Exception occurred while processing the request: {e.Message}");
}
}
}
}
' The following example demonstrates using asynchronous methods to
' get Domain Name System information for the specified host computer.
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