Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie wenden den Await Operator auf einen Operanden in einer asynchronen Methode oder einem Lambda-Ausdruck an, um die Ausführung der Methode anzuhalten, bis die erwartete Aufgabe abgeschlossen ist. Der Vorgang stellt die laufende Arbeit dar.
Die verwendete Methode Await muss über einen Asynchronen Modifizierer verfügen. Eine solche Methode, die mithilfe des Modifizierers definiert und in der Async Regel einen oder Await mehrere Ausdrücke enthält, wird als asynchrone Methode bezeichnet.
Hinweis
Die Async Schlüsselwörter und Await Schlüsselwörter wurden in Visual Studio 2012 eingeführt. Eine Einführung in die asynchrone Programmierung finden Sie unter "Async" und "Await".
In der Regel ist die Aufgabe, auf die Sie den Await Operator anwenden, der Rückgabewert aus einem Aufruf einer Methode, die das Task-Based asynchrones Muster implementiert, d. h. ein Task oder ein Task<TResult>.
Im folgenden Code gibt getContentsTaskdie HttpClient Methode GetByteArrayAsync , a Task(Of Byte()). Die Aufgabe ist eine Zusage, das tatsächliche Bytearray zu erzeugen, wenn der Vorgang abgeschlossen ist. Der Await Operator wird auf das Anhalten der Ausführung SumPageSizesAsync angewendetgetContentsTask, bis getContentsTask er abgeschlossen ist. In der Zwischenzeit wird das Steuerelement an den Aufrufer von SumPageSizesAsync. Wenn getContentsTask der Ausdruck abgeschlossen ist, wird der Await Ausdruck in ein Bytearray ausgewertet.
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
Von Bedeutung
Das vollständige Beispiel finden Sie unter Walkthrough: Accessing the Web by Using Async and Await. Sie können das Beispiel aus dem .NET-Beispielbrowser herunterladen. Der Beispielcode befindet sich im SerialAsyncExample-Projekt.
Wenn Await auf das Ergebnis eines Methodenaufrufs angewendet wird, der einen Task(Of TResult)Zurückgibt, lautet der Typ des Await Ausdrucks TResult. Wenn Await auf das Ergebnis eines Methodenaufrufs angewendet wird, der einen TaskWert zurückgibt, gibt der Await Ausdruck keinen Wert zurück. Der Unterschied wird im folgenden Beispiel veranschaulicht.
' 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 Ausdruck oder eine Await Anweisung blockiert nicht den Thread, auf dem er ausgeführt wird. Stattdessen wird der Compiler dazu veranlasst, den Rest der asynchronen Methode nach dem Await Ausdruck als Fortsetzung für die erwartete Aufgabe zu registrieren. Das Steuerelement kehrt dann zum Aufrufer der asynchronen Methode zurück. Nach Abschluss der Aufgabe ruft sie die Fortsetzung auf, und die Ausführung der asynchronen Methode wird an der Stelle fortgesetzt, an der sie unterbrochen wurde.
Ein Await Ausdruck kann nur im Textkörper einer unmittelbar eingeschlossenen Methode oder eines Lambda-Ausdrucks auftreten, der durch einen Async Modifizierer gekennzeichnet ist. Der Begriff Await dient nur in diesem Kontext als Schlüsselwort. Andernfalls wird sie als Bezeichner interpretiert. Innerhalb der Async Methode oder des Lambda-Ausdrucks kann ein Await Ausdruck nicht in einem Abfrageausdruck, im Catch Oder Finally Block eines Try... Fangen... Schließlich anweisung, in the loop control variable expression of a For or For Each loop, or in the body of a SyncLock statement.
Ausnahmen
Die meisten asynchronen Methoden geben ein Task oder Task<TResult>. Die Eigenschaften der zurückgegebenen Aufgabe enthalten Informationen zu ihrem Status und Verlauf, z. B. ob die Aufgabe abgeschlossen ist, ob die asynchrone Methode eine Ausnahme verursacht oder abgebrochen wurde und was das endergebnis ist. Der Await Operator greift auf diese Eigenschaften zu.
Wenn Sie auf eine asynchrone Methode warten, die eine Ausnahme verursacht, löst der Await Operator die Ausnahme erneut aus.
Wenn Sie eine asynchrone Methode erwarten, die abgebrochen wird, wartet der Await Operator erneut OperationCanceledException.
Eine einzelne Aufgabe, die sich in einem fehlerhaften Zustand befindet, kann mehrere Ausnahmen widerspiegeln. Die Aufgabe kann z. B. das Ergebnis eines Aufrufs Task.WhenAllvon . Wenn Sie auf eine solche Aufgabe warten, wird beim Warten nur eine der Ausnahmen ausgeführt. Sie können jedoch nicht vorhersagen, welche Ausnahmen neu sind.
Beispiele für die Fehlerbehandlung in asynchronen Methoden finden Sie unter Try... Fangen... Abschließende Anweisung.
Beispiel
Das folgende Windows Forms-Beispiel veranschaulicht die Verwendung Await in einer asynchronen Methode. WaitAsynchronouslyAsync Kontrast zum Verhalten dieser Methode mit dem Verhalten von WaitSynchronously. Ohne einen Await Operator WaitSynchronously wird trotz der Verwendung des Async Modifizierers in seiner Definition und einem Aufruf im Thread.Sleep Textkörper synchron 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