次の方法で共有


AsyncResult.AsyncWaitHandle プロパティ

Win32 同期ハンドルをカプセル化し、各種の同期スキームを実装できるようにする WaitHandle を取得します。

Public Overridable ReadOnly Property AsyncWaitHandle As WaitHandle  _   Implements IAsyncResult.AsyncWaitHandle
[C#]
public virtual WaitHandle AsyncWaitHandle {get;}
[C++]
public: __property virtual WaitHandle* get_AsyncWaitHandle();
[JScript]
public function get AsyncWaitHandle() : WaitHandle;

プロパティ値

Win32 同期ハンドルをカプセル化し、各種の同期スキームを実装できるようにする WaitHandle

実装

IAsyncResult.AsyncWaitHandle

解説

このメソッドによって返される WaitHandle は、非同期操作が完了すると自動的にシグナル通知されます。

IAsyncResult を実装しているオブジェクトは、 WaitHandle クラスから直接派生する必要はありません。 WaitHandle は、同期プリミティブをラップし、呼び出しが完了した後でシグナル状態になる必要があります。これによって、クライアントが呼び出しのステータスをポーリングする代わりに、呼び出しが完了するまで待機できます。共通言語ランタイムは、Win32 同期プリミティブを反映した待機可能オブジェクトとして、 ManualResetEventAutoResetEventMutex などを提供します。

WaitHandle は、これらの同期オブジェクトの待機をサポートし、"any (一部)" または "all (すべて)" のセマンティクスでシグナル状態となるメソッドとして、 WaitHandle.WaitOneWaitAny 、および WaitAll を提供します。これらのメソッドは、デッドロックを避けるためにコンテキストを認識します。 AsyncResult.AsyncWaitHandle は、割り当て対象のオブジェクトを占有することも、オブジェクトをあまり拘束しないように割り当てることもできます。これは、 IAsyncResult を実装するオブジェクトによって異なります。

IAsyncResult を返すクラスを実装するオブジェクトには、 AsyncWaitHandle をあまり拘束力のない方法で割り当てることができます。ただし、このハンドルは、割り当てた後は EndInvoke が呼び出されるまで有効なままです。このとき、 AsyncWaitHandle が割り当てられているオブジェクトを再利用できます。

注意    AsyncWaitHandle プロパティに格納されている WaitHandle を使用して、非同期の呼び出しが完了するまで現在のスレッドをブロックできます。ただし、 WaitHandle は、 BeginInvoke の呼び出し時に指定された AsyncCallback がある場合には、それを無視します。したがって、 WaitHandle を使用して、非同期の呼び出しが完了するまでスレッドをブロックした場合でも、 AsyncCallback が実行を完了する前にアプリケーションがシャットダウンしてしまう状況が生じる可能性があります。このような状況の例については、 AsyncResult クラスのトピックの例を参照し、 Thread.Sleep ステートメントを削除してください。

使用例

[Visual Basic, C#, C++] AsyncWaitHandle プロパティを使用して、デリゲートでの非同期呼び出しに対する WaitHandle を取得する方法を次のコード例に示します。完全なコード例については、 AsyncResult クラスの例を参照してください。この例では、 WaitHandle は明示的にシグナル通知されないことに注意してください。これは、 IAsyncResult の実装が、このプロパティから取得した WaitHandle にシグナル通知する必要があるためです。

 
Dim sampleDelegate As New SampSyncSqrDelegate(AddressOf sampSyncObj.Square)
param = 8

Console.WriteLine("Making a single asynchronous call on the context-bound object:")

Dim ar1 As IAsyncResult = sampleDelegate.BeginInvoke(param, New AsyncCallback(AddressOf AsyncResultSample.MyCallback), param)

Console.WriteLine("Waiting for the asynchronous call to complete...")
Dim wh As WaitHandle = ar1.AsyncWaitHandle
wh.WaitOne()

Console.WriteLine("")
Console.WriteLine("Waiting for the AsyncCallback to complete...")
Thread.Sleep(1000)

[C#] 
SampSyncSqrDelegate sampleDelegate = new SampSyncSqrDelegate(sampSyncObj.Square);
param = 8;

Console.WriteLine("Making a single asynchronous call on the context-bound object:");

IAsyncResult ar1 = sampleDelegate.BeginInvoke( param, 
                      new AsyncCallback(AsyncResultSample.MyCallback), 
                      param);

Console.WriteLine("Waiting for the asynchronous call to complete...");
WaitHandle wh = ar1.AsyncWaitHandle;
wh.WaitOne();

Console.WriteLine("");
Console.WriteLine("Waiting for the AsyncCallback to complete...");
Thread.Sleep(1000);

[C++] 
SampSyncSqrDelegate* sampleDelegate = new SampSyncSqrDelegate(sampSyncObj, SampleSyncronized::Square);
param = 8;

Console::WriteLine(S"Making a single asynchronous call on the context-bound Object*:");

IAsyncResult* ar1 = sampleDelegate->BeginInvoke(param, 
    new AsyncCallback(0, AsyncResultSample::MyCallback), 
    __box(param));

Console::WriteLine(S"Waiting for the asynchronous call to complete...");
WaitHandle* wh = ar1->AsyncWaitHandle;
wh->WaitOne();

Console::WriteLine(S"");
Console::WriteLine(S"Waiting for the AsyncCallback to complete...");
Thread::Sleep(1000);

return 0;

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

AsyncResult クラス | AsyncResult メンバ | System.Runtime.Remoting.Messaging 名前空間 | WaitHandle