Freigeben über


AsyncResult.AsyncWaitHandle-Eigenschaft

Ruft ein WaitHandle ab, das Win32-Synchronisierungshandles kapselt und die Implementierung verschiedener Synchronisierungsschemas ermöglicht.

Namespace: System.Runtime.Remoting.Messaging
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
Public Overridable ReadOnly Property AsyncWaitHandle As WaitHandle
'Usage
Dim instance As AsyncResult
Dim value As WaitHandle

value = instance.AsyncWaitHandle
public virtual WaitHandle AsyncWaitHandle { get; }
public:
virtual property WaitHandle^ AsyncWaitHandle {
    WaitHandle^ get ();
}
/** @property */
public WaitHandle get_AsyncWaitHandle ()
public function get AsyncWaitHandle () : WaitHandle

Eigenschaftenwert

Ein WaitHandle, das Win32-Synchronisierungshandles kapselt und die Implementierung verschiedener Synchronisierungsschemas ermöglicht.

Hinweise

Der von dieser Methode zurückgegebene WaitHandle wird automatisch signalisiert, wenn der asynchrone Vorgang abgeschlossen ist.

Ein Objekt, das IAsyncResult implementiert, muss nicht direkt von den WaitHandle-Klassen abgeleitet sein. WaitHandle schließt sein Synchronisierungsgrundelement ein und muss nach Abschluss des Aufrufs ein Signal erhalten. Dies ermöglicht es dem Client, auf den Abschluss des Aufrufs zu warten, anstatt den Status des Aufrufs abzurufen. Die Common Language Runtime stellt eine Reihe von Wait-fähigen Objekten bereit, die die Grundelemente der Win32-Synchronisierung spiegeln, z. B. ManualResetEvent, AutoResetEvent und Mutex.

WaitHandle stellt Methoden bereit, die das Warten auf die Signalisierung solcher Synchronisierungsobjekte unter Verwendung einer "any"- oder "all"-Semantik unterstützen, d. h. WaitHandle.WaitOne, WaitAny und WaitAll. Zum Vermeiden von Deadlocks sind solche Methoden kontextabhängig. Das AsyncResult.AsyncWaitHandle kann unverzüglich oder verzögert zugeordnet werden. Dies ist der IAsyncResult-Implementierung freigestellt.

Bei Klassenimplementierungen, die IAsyncResult zurückgeben, ist zu berücksichtigen, dass das AsyncWaitHandle verzögert zugeordnet werden kann. Nach der Zuordnung sollte die Aktivierung jedoch beibehalten werden, bis der Benutzer EndInvoke aufruft. Zu diesem Zeitpunkt kann das Objekt hinter AsyncWaitHandle wiederverwendet werden.

Warnung

Mit dem in der AsyncWaitHandle-Eigenschaft enthaltenen WaitHandle kann der aktuelle Thread blockiert werden, bis der asynchrone Aufruf abgeschlossen ist. Das WaitHandle ignoriert jedoch den AsyncCallback, wenn beim BeginInvoke-Aufruf ein solcher angegeben wurde. Auch bei einer Blockierung durch ein WaitHandle bis zum Abschluss des asynchronen Aufrufs kann daher eine Situation eintreten, in der die Anwendung beendet wird, bevor die Ausführung von AsyncCallback abgeschlossen ist. Eine solche Situation wird im Beispiel für die AsyncResult-Klasse veranschaulicht, wenn Sie die Thread.Sleep-Anweisung entfernen.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie mit der AsyncWaitHandle-Eigenschaft ein WaitHandle für einen asynchronen Aufruf eines Delegaten abgerufen wird. Den vollständigen Beispielcode finden Sie im Beispiel zur AsyncResult-Klasse. Beachten Sie, dass das WaitHandle in diesem Beispiel nicht explizit signalisiert wird. Der Grund hierfür ist, dass für das Signalisieren des über diese Eigenschaft abgerufenen WaitHandle Implementierungen von IAsyncResult zuständig sind.

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)
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);
SampSyncSqrDelegate^ sampleDelegate = gcnew SampSyncSqrDelegate( sampSyncObj, &SampleSyncronized::Square );
param = 8;
Console::WriteLine( "Making a single asynchronous call on the context-bound Object*:" );
IAsyncResult^ ar1 = sampleDelegate->BeginInvoke( param, gcnew 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 );
return 0;
SampSyncSqrDelegate sampleDelegate =
    new SampSyncSqrDelegate(sampSyncObj.Square);
param = 8;
value = param;
Console.WriteLine("Making a single asynchronous call on the "
    + "context-bound object:");
IAsyncResult ar1 = sampleDelegate.BeginInvoke(param,
    new AsyncCallback(AsyncResultSample.MyCallback), sampleDelegate);

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

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

Plattformen

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

AsyncResult-Klasse
AsyncResult-Member
System.Runtime.Remoting.Messaging-Namespace
WaitHandle