AsyncCallback 代理人
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
參考要在對應之非同步作業完成時呼叫的方法。
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)
參數
- ar
- IAsyncResult
非同步作業的結果。
- 屬性
範例
下列範例示範在 Dns 類別中使用非同步方法,以擷取使用者指定電腦的網域名稱系統 (DNS) 資訊。 此範例會建立參考ProcessDnsInformation
方法的 AsyncCallback 委派。 此方法會呼叫每一個非同步要求一次以取得 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
備註
AsyncCallback使用委派在個別執行緒中處理非同步作業的結果。 委派 AsyncCallback 代表非同步作業完成時所呼叫的回呼方法。 回呼方法會採用 IAsyncResult 參數,其後續會用來取得非同步作業的結果。
如需非同步程式設計的詳細資訊,請參閱使用 AsyncCallback 委派結束非同步作業和使用事件架構非同步模式中的AsyncCallback 委派和狀態物件, (EAP) 。
擴充方法
GetMethodInfo(Delegate) |
取得表示特定委派所代表之方法的物件。 |