다음을 통해 공유


AsyncWaitHandle을 사용하는 응용 프로그램 실행 블로킹

비동기 작업의 결과를 기다리는 동안 다른 작업을 계속 수행할 수 없는 응용 프로그램은 해당 작업이 완료될 때까지 블로킹되어야 합니다. 비동기 작업 완료를 기다리는 동안 다음 옵션 중 하나를 사용하여 응용 프로그램의 주 스레드를 블로킹합니다.

비동기 작업이 완료될 때까지 하나 이상의 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);
            }
        }
    }
}

참고 항목

개념

이벤트 기반 비동기 패턴 개요

기타 리소스

비동기 프로그래밍 디자인 패턴