AsyncCallback Delegato
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Fa riferimento a un metodo da chiamare quando viene completata un'operazione asincrona corrispondente.
public delegate void AsyncCallback(IAsyncResult ^ ar);
public delegate void AsyncCallback(IAsyncResult ar);
[System.Serializable]
public delegate void AsyncCallback(IAsyncResult ar);
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public delegate void AsyncCallback(IAsyncResult ar);
type AsyncCallback = delegate of IAsyncResult -> unit
[<System.Serializable>]
type AsyncCallback = delegate of IAsyncResult -> unit
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type AsyncCallback = delegate of IAsyncResult -> unit
Public Delegate Sub AsyncCallback(ar As IAsyncResult)
Parametri
- ar
- IAsyncResult
Risultato dell'operazione asincrona.
- Attributi
Esempio
Nell'esempio di codice seguente viene illustrato come usare metodi asincroni nella classe Dns per recuperare le informazioni sul DNS (Domain Name System) per i computer specificati dall'utente. Questo esempio crea un delegato AsyncCallback che fa riferimento al metodo ProcessDnsInformation
. Questo metodo viene chiamato una volta per ogni richiesta asincrona per le informazioni DNS.
/*
The following example demonstrates using asynchronous methods to
get Domain Name System information for the specified host computers.
This example uses a delegate to obtain the results of each asynchronous
operation.
*/
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections.Specialized;
using System.Collections;
namespace Examples.AdvancedProgramming.AsynchronousOperations
{
public class UseDelegateForAsyncCallback
{
static int requestCounter;
static ArrayList hostData = new ArrayList();
static StringCollection hostNames = new StringCollection();
static void UpdateUserInterface()
{
// Print a message to indicate that the application
// is still working on the remaining requests.
Console.WriteLine("{0} requests remaining.", requestCounter);
}
public static void Main()
{
// Create the delegate that will process the results of the
// asynchronous request.
AsyncCallback callBack = new AsyncCallback(ProcessDnsInformation);
string host;
do
{
Console.Write(" Enter the name of a host computer or <enter> to finish: ");
host = Console.ReadLine();
if (host.Length > 0)
{
// Increment the request counter in a thread safe manner.
Interlocked.Increment(ref requestCounter);
// Start the asynchronous request for DNS information.
Dns.BeginGetHostEntry(host, callBack, host);
}
} while (host.Length > 0);
// The user has entered all of the host names for lookup.
// Now wait until the threads complete.
while (requestCounter > 0)
{
UpdateUserInterface();
}
// Display the results.
for (int i = 0; i< hostNames.Count; i++)
{
object data = hostData [i];
string message = data as string;
// A SocketException was thrown.
if (message != null)
{
Console.WriteLine("Request for {0} returned message: {1}",
hostNames[i], message);
continue;
}
// Get the results.
IPHostEntry h = (IPHostEntry) data;
string[] aliases = h.Aliases;
IPAddress[] addresses = h.AddressList;
if (aliases.Length > 0)
{
Console.WriteLine("Aliases for {0}", hostNames[i]);
for (int j = 0; j < aliases.Length; j++)
{
Console.WriteLine("{0}", aliases[j]);
}
}
if (addresses.Length > 0)
{
Console.WriteLine("Addresses for {0}", hostNames[i]);
for (int k = 0; k < addresses.Length; k++)
{
Console.WriteLine("{0}",addresses[k].ToString());
}
}
}
}
// The following method is called when each asynchronous operation completes.
static void ProcessDnsInformation(IAsyncResult result)
{
string hostName = (string) result.AsyncState;
hostNames.Add(hostName);
try
{
// Get the results.
IPHostEntry host = Dns.EndGetHostEntry(result);
hostData.Add(host);
}
// Store the exception message.
catch (SocketException e)
{
hostData.Add(e.Message);
}
finally
{
// Decrement the request counter in a thread-safe manner.
Interlocked.Decrement(ref requestCounter);
}
}
}
}
// The following example demonstrates using asynchronous methods to
// get Domain Name System information for the specified host computers.
// This example uses a delegate to obtain the results of each asynchronous
// operation.
open System
open System.Net
open System.Net.Sockets
open System.Threading
open System.Collections.Specialized
let mutable requestCounter = 0
let hostData = ResizeArray<Result<IPHostEntry, string>>()
let hostNames = StringCollection()
let updateUserInterface () =
// Print a message to indicate that the application
// is still working on the remaining requests.
printfn $"{requestCounter} requests remaining."
// The following function is called when each asynchronous operation completes.
let processDnsInformation (result: IAsyncResult) =
string result.AsyncState
|> hostNames.Add
|> ignore
try
try
// Get the results.
Dns.EndGetHostEntry result
|> Ok
|> hostData.Add
// Store the exception message.
with :? SocketException as e ->
Error e.Message
|> hostData.Add
finally
// Decrement the request counter in a thread-safe manner.
Interlocked.Decrement &requestCounter
|> ignore
// Create the delegate that will process the results of the asynchronous request.
let callBack = AsyncCallback processDnsInformation
let mutable host = " "
while host.Length > 0 do
printf " Enter the name of a host computer or <enter> to finish: "
host <- stdin.ReadLine()
if host.Length > 0 then
// Increment the request counter in a thread safe manner.
Interlocked.Increment &requestCounter |> ignore
// Start the asynchronous request for DNS information.
Dns.BeginGetHostEntry(host, callBack, host) |> ignore
// The user has entered all of the host names for lookup.
// Now wait until the threads complete.
while requestCounter > 0 do
updateUserInterface ()
// Display the results.
for i = 0 to hostNames.Count - 1 do
match hostData[i] with
| Error message ->
// A SocketException was thrown.
printfn $"Request for {hostNames[i]} returned message: {message}"
| Ok entry ->
// Get the results.
let aliases = entry.Aliases
let addresses = entry.AddressList
if aliases.Length > 0 then
printfn $"Aliases for {hostNames[i]}"
for alias in aliases do
printfn $"{alias}"
if addresses.Length > 0 then
printfn $"Addresses for {hostNames[i]}"
for address in addresses do
printfn $"{address}"
'The following example demonstrates using asynchronous methods to
'get Domain Name System information for the specified host computers.
'This example uses a delegate to obtain the results of each asynchronous
'operation.
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Collections.Specialized
Imports System.Collections
Namespace Examples.AdvancedProgramming.AsynchronousOperations
Public Class UseDelegateForAsyncCallback
Dim Shared requestCounter as Integer
Dim Shared hostData as ArrayList = new ArrayList()
Dim Shared hostNames as StringCollection = new StringCollection()
Shared Sub UpdateUserInterface()
' Print a message to indicate that the application
' is still working on the remaining requests.
Console.WriteLine("{0} requests remaining.", requestCounter)
End Sub
Public Shared Sub Main()
' Create the delegate that will process the results of the
' asynchronous request.
Dim callBack as AsyncCallback
Dim host as string
Dim i, j, k as Integer
callback = AddressOf ProcessDnsInformation
Do
Console.Write(" Enter the name of a host computer or <enter> to finish: ")
host = Console.ReadLine()
If host.Length > 0
' Increment the request counter in a thread safe manner.
Interlocked.Increment(requestCounter)
' Start the asynchronous request for DNS information.
Dns.BeginGetHostEntry(host, callBack, host)
End If
Loop While (host.Length > 0)
' The user has entered all of the host names for lookup.
' Now wait until the threads complete.
Do While requestCounter > 0
UpdateUserInterface()
Loop
' Display the results.
For i = 0 To hostNames.Count -1
Dim dataObject as Object = hostData (i)
Dim message as String
' Was a SocketException was thrown?
If TypeOf dataObject is String
message = CType(dataObject, String)
Console.WriteLine("Request for {0} returned message: {1}", _
hostNames(i), message)
Else
' Get the results.
Dim h as IPHostEntry = CType(dataObject, IPHostEntry)
Dim aliases() as String = h.Aliases
Dim addresses() as IPAddress = h.AddressList
If aliases.Length > 0
Console.WriteLine("Aliases for 0}", hostNames(i))
For j = 0 To aliases.Length -1
Console.WriteLine("{0}", aliases(j))
Next j
End If
If addresses.Length > 0
Console.WriteLine("Addresses for {0}", hostNames(i))
For k = 0 To addresses.Length -1
Console.WriteLine("{0}",addresses(k).ToString())
Next k
End If
End If
Next i
End Sub
' The following method is called when each asynchronous operation completes.
Shared Sub ProcessDnsInformation(result as IAsyncResult)
Dim hostName as String = CType(result.AsyncState, String)
hostNames.Add(hostName)
Try
' Get the results.
Dim host as IPHostEntry = Dns.EndGetHostEntry(result)
hostData.Add(host)
' Store the exception message.
Catch e as SocketException
hostData.Add(e.Message)
Finally
' Decrement the request counter in a thread-safe manner.
Interlocked.Decrement(requestCounter)
End Try
End Sub
End Class
End Namespace
Commenti
Usare un AsyncCallback delegato per elaborare i risultati di un'operazione asincrona in un thread separato. Il AsyncCallback delegato rappresenta un metodo di callback che viene chiamato al termine dell'operazione asincrona. Il metodo di callback accetta un IAsyncResult parametro, che viene successivamente usato per ottenere i risultati dell'operazione asincrona.
Per altre informazioni sulla programmazione asincrona, vedere Using an AsyncCallback Delegate to End an Asynchronous Operation and Using an AsyncCallback Delegate and State Object in Event-based Asynchronous Pattern (EAP).
Metodi di estensione
GetMethodInfo(Delegate) |
Ottiene un oggetto che rappresenta il metodo rappresentato dal delegato specificato. |