Abrufen des Status einer asynchronen Operation
Aktualisiert: November 2007
Anwendungen, die während des Wartens auf die Ergebnisse asynchroner Operationen noch weitere Aufgaben ausführen können, dürfen nicht bis zum Abschluss der Operation blockieren. Damit die Ausführung von Aufgaben während des Wartens auf den Abschluss einer asynchronen Methode fortgesetzt wird, verwenden Sie eine der folgenden Optionen:
Verwenden Sie die IsCompleted-Eigenschaft des IAsyncResult, das von der BeginOperationName-Methode der asynchronen Operation zurückgegeben wird, um den Abschluss der Operation festzustellen. Diese Vorgehensweise ist als Abrufen bekannt und wird in diesem Thema veranschaulicht.
Verwenden Sie einen AsyncCallback-Delegaten, um die Ergebnisse der asynchronen Operation in einem separaten Thread zu verarbeiten. Ein Beispiel zu dieser Vorgehensweise finden Sie unter Verwenden eines AsyncCallback-Delegaten zum Beenden einer asynchronen Operation.
Beispiel
Das folgende Codebeispiel veranschaulicht, wie asynchrone Methoden in der Dns-Klasse verwendet werden, um DNS-Daten für einen vom Benutzer festgelegten Computer abzurufen. Im Beispiel werden die asynchrone Operation gestartet und anschließend bis zu deren Abschluss Punkte (".") auf die Konsole gedruckt. Beachten Sie, dass null (Nothing in Visual Basic) für den BeginGetHostByNameAsyncCallback-Parameter und den Object-Parameter übergeben wird, da solche Argumente für diese Vorgehensweise nicht erforderlich sind.
'The following example demonstrates using asynchronous methods to
'get Domain Name System information for the specified host computer.
'This example polls to detect the end of the asynchronous operation.
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Namespace Examples.AdvancedProgramming.AsynchronousOperations
Public Class PollUntilOperationCompletes
Shared Sub UpdateUserInterface()
' Print a period to indicate that the application
' is still working on the request.
Console.Write(".")
End Sub
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...")
' Poll for completion information.
' Print periods (".") until the operation completes.
Do while result.IsCompleted <> True
UpdateUserInterface()
Loop
' The operation is complete. Process the results.
' Print a new line.
Console.WriteLine()
Try
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.
This example polls to detect the end of the asynchronous operation.
*/
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Examples.AdvancedProgramming.AsynchronousOperations
{
public class PollUntilOperationCompletes
{
static void UpdateUserInterface()
{
// Print a period to indicate that the application
// is still working on the request.
Console.Write(".");
}
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 asychronous request for DNS information.
IAsyncResult result = Dns.BeginGetHostEntry(args[0], null, null);
Console.WriteLine("Processing request for information...");
// Poll for completion information.
// Print periods (".") until the operation completes.
while (result.IsCompleted != true)
{
UpdateUserInterface();
}
// The operation is complete. Process the results.
// Print a new line.
Console.WriteLine();
try
{
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("An exception occurred while processing the request: {0}", e.Message);
}
}
}
}
Siehe auch
Konzepte
Übersicht über ereignisbasierte asynchrone Muster