Language

AsyncWaitHandle を使用してアプリケーションの実行をブロックする

非同期操作の結果を待機している間に他の作業を続行できないアプリケーションは、操作が完了するまでブロックする必要があります。 非同期操作の完了を待機している間にアプリケーションのメイン スレッドをブロックするには、次のいずれかのオプションを使用します。

非同期操作が完了するまでブロックするために 1 つ以上の WaitHandle オブジェクトを使用するアプリケーションは、通常、 BeginOperationName メソッドを呼び出し、操作の結果なしで実行できる作業を実行し、非同期操作が完了するまでブロックします。 アプリケーションは、WaitOneを使用して AsyncWaitHandle メソッドのいずれかを呼び出すことによって、1 つの操作をブロックできます。 一連の非同期操作の完了を待機している間にブロックするには、関連付けられている AsyncWaitHandle オブジェクトを配列に格納し、 WaitAll メソッドのいずれかを呼び出します。 一連の非同期操作のいずれかが完了するのを待機している間にブロックするには、関連付けられている AsyncWaitHandle オブジェクトを配列に格納し、 WaitAny メソッドのいずれかを呼び出します。

例

次のコード例では、DNS クラスで非同期メソッドを使用して、ユーザー指定のコンピューターのドメイン ネーム システム情報を取得する方法を示します。 この例では、非同期操作に関連付けられている WaitHandle を使用したブロックを示します。 null (Visual Basic のNothing) は、BeginGetHostByNamerequestCallbackパラメーターと stateObject パラメーターに渡されることに注意してください。これは、この方法を使用する場合は必須ではないためです。

/*
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($"{aliases[i]}");
                    }
                }
                if (addresses.Length > 0)
                {
                    Console.WriteLine("Addresses");
                    for (int i = 0; i < addresses.Length; i++)
                    {
                        Console.WriteLine($"{addresses[i].ToString()}");
                    }
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine($"Exception occurred while processing the request: {e.Message}");
            }
        }
    }
}
' The following example demonstrates using asynchronous methods to
' get Domain Name System information for the specified host computer.

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

こちらもご覧ください