Freigeben über


Await-Operator (Visual Basic)

Sie wenden den Await-Operator zu einem Operanden in einer asynchronen Methode oder einem Lambda-Ausdruck, die Ausführung der - Methode aufzunehmen, bis die erwartete Aufgabe ausführt.Die Aufgabe wird derzeit ausgeführte Arbeit dar.

Die Methode, mit der Await verwendet wird, muss einen Asynchrone-Modifizierer haben.Eine solche Methode, definiert, indem der Async-Modifizierer verwendet, und gewöhnlich eine oder mehrere Await Ausdrücke enthält, wird als eine asynchrone Methode.

HinweisHinweis

Die Async und Await Schlüsselwörter wurden in Visual Studio 2012 eingeführt.Weitere Informationen zu neuen Funktionen in dieser Version, finden Sie unter Neues in Visual Studio 2012.

Eine Einführung in die asynchrone Programmierung, finden Sie unter Asynchrone Programmierung mit Async und Await (C# und Visual Basic).

In der Regel mit dem die Aufgabe Sie gelten, ist der Await-Operator der Rückgabewert von einem Aufruf einer Methode, die ein. Task oder Task<TResult> implementiert Aufgabenbasiertes asynchrone Muster.

Im folgenden Code werden die HttpClient-Methode GetByteArrayAsyncgetContentsTask, Task(Of Byte()) zurück.Die Aufgabe ist eine Zusicherung, das tatsächliche Bytearray zu erzeugen, wenn der Vorgang abgeschlossen ist.Der Await-Operator wird auf getContentsTask angewendet, um die Ausführung in SumPageSizesAsync angehalten, bis getContentsTask abgeschlossen ist.Mittlerweile wird Steuerelement zum Aufrufer von SumPageSizesAsync zurückgegeben.Wenn getContentsTask beendet ist, wertet der Await Ausdruck in ein Bytearray aus.

Private Async Function SumPageSizesAsync() As Task

    ' To use the HttpClient type in desktop apps, you must include a using directive and add a 
    ' reference for the System.Net.Http namespace.
    Dim client As HttpClient = New HttpClient() 
    ' . . . 
    Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
    Dim urlContents As Byte() = Await getContentsTask

    ' Equivalently, now that you see how it works, you can write the same thing in a single line.
    'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    ' . . .
End Function
Wichtiger HinweisWichtig

Das vollständige Beispiel finden Sie unter Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic).Sie können das Beispiel Entwickler-Codebeispiele auf der Microsoft-Website herunterladen.Das Beispiel ist im AsyncWalkthrough_HttpClient-Projekt.

Wenn Await zum Ergebnis eines Methodenaufrufs angewendet wird, der Task(Of TResult) zurückgibt, ist der Typ des Await Ausdrucks TResult.Wenn Await zum Ergebnis eines Methodenaufrufs angewendet wird, der Task zurückgibt, gibt der Ausdruck Await keinen Wert zurück.Das folgende Beispiel veranschaulicht den Unterschied.

' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()

' Await used with a method that returns a Task.
Await AsyncMethodThatReturnsTask()

Ein Await Ausdruck oder -Anweisung blockiert nicht den Thread, in dem sie ausgeführt wird.Stattdessen wird dadurch den Compiler, den Rest der asynchronen Methode, nach dem Await Ausdruck anzumelden, wie eine Fortsetzung auf der erwarteten Aufgabe.Steuerelement kehrt dann an den Aufrufer der asynchronen Methode zurück.Wenn die Aufgabe abgeschlossen hat, ruft sie die Fortsetzung und Ausführung der asynchronen Methodenzusammenfassungen, in denen sie weg abgebrochen wurde.

Ein Await Ausdruck kann nur im Text einer sofort einschließenden Methode oder des Lambda-Ausdrucks auftreten, der durch einen Async-Modifizierer gekennzeichnet ist.Der Begriff erwarten dient als Schlüsselwort nur in diesem Kontext.Anderswo wird er als Bezeichner interpretiert.Innerhalb der asynchronen Methode oder eines Lambda-Ausdrucks kann ein Await Ausdruck nicht in einem Abfrageausdruck, im catch oder finally-Block einer Try... catch... finally-Anweisung-Anweisung, im Schleifensteuerungsvariablenausdruck einer For oder For Each-Schleife oder im Text einer SyncLock-Anweisung auftreten.

Ausnahmen

Die meisten asynchronen Methoden geben Task oder Task<TResult> zurück.Die Eigenschaften der zurückgegebenen Aufgabe enthalten Informationen über den Status und Verlauf, wie, ob die Aufgabe abgeschlossen ist, ob die asynchrone Methode eine Ausnahme verursachen könnte oder abgebrochen wurde, und welches Ergebnis ist.Der Operator Await greift auf diese Eigenschaften zu.

Wenn Sie eine Aufgabe-zurückkehrende asynchrone Methode erwarten, die eine Ausnahme verursacht, löst der Operator Await die Ausnahme erneut aus.

Wenn Sie eine Aufgabe-zurückkehrende asynchrone Methode erwarten, die abgebrochen wird, löst der Operator AwaitOperationCanceledException erneut aus.

Eine einzelne Aufgabe, die in einem "Faulted" Zustand befindet, kann mehrere Ausnahmen entsprechen.Beispielsweise könnte die Aufgabe das Ergebnis eines Aufrufs zu Task.WhenAll.Wenn Sie eine solche Aufgabe erwarten, löst der Erwartungsvorgang nur eine Ausnahmen erneut aus.Sie können jedoch nicht vorhersagen, welches der Ausnahmen erneut ausgelöst wird.

Beispiele für die Fehlerbehandlung in asynchronen Methoden, finden Sie unter Try...Catch...Finally-Anweisung (Visual Basic).

Beispiel

Im folgenden Windows Forms veranschaulicht die Verwendung von Await in einer asynchronen Methode, WaitAsynchronouslyAsync.Vergleichen Sie das Verhalten dieser Methode mit dem Verhalten von WaitSynchronously.Ohne einen Await-Operator wird WaitSynchronously synchron trotz der Verwendung von dem Async-Modifizierer in ihrer Definition und in einem Aufruf von Thread.Sleep in seinem Text ausgeführt.

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Call the method that runs asynchronously.
    Dim result As String = Await WaitAsynchronouslyAsync()

    ' Call the method that runs synchronously.
    'Dim result As String = Await WaitSynchronously()

    ' Display the result.
    TextBox1.Text &= result
End Sub

' The following method runs asynchronously. The UI thread is not
' blocked during the delay. You can move or resize the Form1 window 
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
    Await Task.Delay(10000)
    Return "Finished"
End Function

' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
    ' Import System.Threading for the Sleep method.
    Thread.Sleep(10000)
    Return "Finished"
End Function

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic)

Referenz

Async (Visual Basic)

Konzepte

Asynchrone Programmierung mit Async und Await (C# und Visual Basic)