Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Azokat az alkalmazásokat, amelyek nem tudják folytatni a munkát, miközben az aszinkron művelet eredményeire várnak, a művelet befejezéséig le kell tiltani. Az alábbi lehetőségek egyikével letilthatja az alkalmazás fő szálát, miközben az aszinkron művelet befejezésére vár:
Az aszinkron művelet AsyncWaitHandleIAsyncResult metódus által visszaadott tulajdonságát, a -t használja. Ezt a megközelítést ebben a témakörben mutatjuk be.
Az aszinkron művelet EndOperationName metódus meghívása. Ezt a megközelítést bemutató példát Az alkalmazásvégrehajtás blokkolása aszinkron művelet befejezésévelcímű témakörben talál.
Azok az alkalmazások, amelyek egy vagy több WaitHandle objektumot használnak annak érdekében, hogy blokkolják a folyamatot egy aszinkron művelet befejezéséig, általában meghívják a BeginOperationName metódust, végrehajtanak minden olyan munkát, amelyet a művelet eredményei nélkül el lehet végezni, majd blokkolnak, amíg az aszinkron művelet(ek) be nem fejeződik/fejeződnek. Egy alkalmazás egyetlen műveletet blokkolhat, ha meghívja az egyik WaitOne metódust a AsyncWaitHandlehasználatával. Az aszinkron műveletek végrehajtására való várakozás letiltásához tárolja a kapcsolódó AsyncWaitHandle objektumokat egy tömbben, és hívja meg az egyik WaitAll metódust. Ha blokkolni szeretné az aszinkron műveletek bármelyikének befejezésére való várakozást, tárolja a társított AsyncWaitHandle objektumokat egy tömbben, és hívja meg az egyik WaitAny metódust.
Példa
Az alábbi példakód bemutatja, hogyan használható aszinkron metódusok a DNS-osztályban a felhasználó által megadott számítógép tartománynévrendszer-adatainak lekérésére. A példa az aszinkron művelethez társított WaitHandle használatával történő blokkolást mutatja be. Fontos megjegyezni, hogy a null (Nothing a Visual Basicben) átadásra kerül a BeginGetHostByName,requestCallback és stateObject paraméterekhez, mert ezek nem szükségesek ennél a megközelítésnél.
/*
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