비동기 작업을 종료하여 응용 프로그램 실행 블로킹
비동기 작업의 결과를 기다리는 동안 다른 작업을 계속 수행할 수 없는 응용 프로그램은 해당 작업이 완료될 때까지 블로킹되어야 합니다. 비동기 작업 완료를 기다리는 동안 다음 옵션 중 하나를 사용하여 응용 프로그램의 주 스레드를 블로킹합니다.
비동기 작업 EndOperationName 메서드를 호출합니다. 이 방법에 대해서는 이 항목에서 설명합니다.
비동기 작업의 BeginOperationName 메서드에 의해 반환된 IAsyncResult의 AsyncWaitHandle 속성을 사용합니다. 이 방법을 보여 주는 예제를 보려면 AsyncWaitHandle을 사용하는 응용 프로그램 실행 블로킹을 참조하십시오.
비동기 작업이 완료될 때까지 EndOperationName 메서드를 사용하여 블로킹하는 응용 프로그램은 일반적으로 BeginOperationName 메서드를 호출하고 해당 작업의 결과에 관계없이 완료될 수 있는 작업을 수행한 다음 EndOperationName을 호출합니다.
예제
다음 코드 예제에서는 Dns 클래스의 비동기 메서드를 사용하여 사용자 지정 컴퓨터에 대한 Domain Name System 정보를 검색하는 방법을 보여 줍니다. 이 방법을 사용할 때는 이러한 인수가 필요하지 않으므로 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
Namespace Examples.AdvancedProgramming.AsynchronousOperations
Public Class BlockUntilOperationCompletes
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.
' This example does not use a delegate or user-supplied object
' so the last two arguments are Nothing.
Dim result as IAsyncResult = Dns.BeginGetHostEntry(args(0), Nothing, Nothing)
Console.WriteLine("Processing your request for information...")
' Do any additional work that can be done here.
Try
' EndGetHostByName blocks until the process completes.
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;
namespace Examples.AdvancedProgramming.AsynchronousOperations
{
public class BlockUntilOperationCompletes
{
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.
// This example does not use a delegate or user-supplied object
// so the last two arguments are null.
IAsyncResult result = Dns.BeginGetHostEntry(args[0], null, null);
Console.WriteLine("Processing your request for information...");
// Do any additional work that can be done here.
try
{
// EndGetHostByName blocks until the process completes.
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);
}
}
}
}