AsyncWaitHandle을 사용하는 응용 프로그램 실행 블로킹
비동기 작업의 결과를 기다리는 동안 다른 작업을 계속 수행할 수 없는 응용 프로그램은 해당 작업이 완료될 때까지 블로킹되어야 합니다. 비동기 작업 완료를 기다리는 동안 다음 옵션 중 하나를 사용하여 응용 프로그램의 주 스레드를 블로킹합니다.
비동기 작업의 BeginOperationName 메서드에 의해 반환된 IAsyncResult의 AsyncWaitHandle 속성을 사용합니다. 이 방법에 대해서는 이 항목에서 설명합니다.
비동기 작업의 EndOperationName 메서드를 호출합니다. 이 방법을 보여 주는 예제를 보려면 비동기 작업을 종료하여 응용 프로그램 실행 블로킹을 참조하십시오.
비동기 작업이 완료될 때까지 하나 이상의 WaitHandle 개체를 사용하여 블로킹되는 응용 프로그램은 일반적으로 BeginOperationName 메서드를 호출하고 작업 결과 없이 수행할 수 있는 작업을 수행한 후 비동기 작업이 완료될 때까지 블로킹됩니다. 응용 프로그램은 AsyncWaitHandle을 통해 WaitOne 메서드 중 하나를 호출하여 단일 작업을 블로킹할 수 있습니다. 비동기 작업 모음이 완료되기를 기다리는 동안 블로킹하려면 관련된 AsyncWaitHandle 개체를 배열에 저장하고 WaitAll 메서드 중 하나를 호출합니다. 비동기 작업 모음 중 작업 하나가 완료되기를 기다리는 동안 블로킹하려면 관련된 AsyncWaitHandle 개체를 배열에 저장하고 WaitAny 메서드 중 하나를 호출합니다.
예제
다음 코드 예제에서는 DNS 클래스의 비동기 메서드를 사용하여 사용자 지정 컴퓨터에 대한 Domain Name System 정보를 검색하는 방법을 보여 줍니다. 이 예제에서는 비동기 작업과 관련된 WaitHandle을 사용하는 블로킹 작업을 보여 줍니다. 이 방법을 사용할 때는 BeginGetHostByName requestCallback 및 stateObject 매개 변수가 필요하지 않으므로 이러한 매개 변수에 대해서는 null(Visual Basic에서는 Nothing)이 전달됩니다.
' The following example demonstrates using asynchronous methods to
' get Domain Name System information for the specified host computer.
Imports System
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
/*
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("{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("Exception occurred while processing the request: {0}",
e.Message);
}
}
}
}