Share via


Await Operator (Visual Basic)

U past de Await operator toe op een operand in een asynchrone methode of lambda-expressie om de uitvoering van de methode te onderbreken totdat de verwachte taak is voltooid. De taak vertegenwoordigt doorlopend werk.

De methode waarin Await wordt gebruikt, moet een Asynchrone wijzigingsfunctie hebben. Een dergelijke methode, gedefinieerd met behulp van de Async modifier en meestal met een of meer Await expressies, wordt een asynchrone methode genoemd.

Notitie

De Async trefwoorden en Await trefwoorden zijn geïntroduceerd in Visual Studio 2012. Zie Asynchrone programmering met Asynchroon programmeren en Await voor een inleiding tot asynchrone programmering.

Normaal gesproken is de taak waarop u de Await operator toepast de retourwaarde van een aanroep naar een methode waarmee het asynchrone patroon op basis van taken wordt geïmplementeerd, dat wil gezegd een Task of een Task<TResult>.

In de volgende code retourneert getContentsTaskde HttpClient methode GetByteArrayAsync , een Task(Of Byte()). De taak is een belofte om de werkelijke bytematrix te produceren wanneer de bewerking is voltooid. De Await operator wordt toegepast om de uitvoering in SumPageSizesAsync te getContentsTask onderbreken totdat getContentsTask deze is voltooid. Ondertussen wordt het besturingselement teruggezet naar de beller van SumPageSizesAsync. Wanneer getContentsTask de expressie is voltooid, Await wordt een bytematrix geëvalueerd.

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

Belangrijk

Zie Walkthrough voor het volledige voorbeeld : Het web openen met behulp van Async en Await. U kunt het voorbeeld downloaden vanuit de .NET-voorbeeldbrowser. De voorbeeldcode bevindt zich in het SerialAsyncExample-project .

Als Await wordt toegepast op het resultaat van een methode-aanroep die een Task(Of TResult)retourneert, is het type expressie Await TResult. Als Await wordt toegepast op het resultaat van een methode-aanroep die een Taskretourneert, retourneert de Await expressie geen waarde. In het volgende voorbeeld ziet u het verschil.

' 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()

Een Await expressie of instructie blokkeert niet de thread waarop deze wordt uitgevoerd. In plaats daarvan zorgt de compiler ervoor dat de rest van de asynchrone methode, na de Await expressie, wordt geregistreerd als vervolg op de verwachte taak. Control keert vervolgens terug naar de aanroeper van de asynchrone methode. Wanneer de taak is voltooid, wordt de voortzetting aangeroepen en wordt de uitvoering van de asynchrone methode hervat waar deze was gebleven.

Een Await expressie kan alleen voorkomen in de hoofdtekst van een methode of lambda-expressie die is gemarkeerd door een Async wijzigingsfunctie. De term Await fungeert alleen als een trefwoord in die context. Elders wordt het geïnterpreteerd als een id. Binnen de Async methode of lambda-expressie kan een Await expressie niet voorkomen in een query-expressie, in het Catch of Finally blok van een Try... Vangen... Ten slotte instructie, in de lusbesturingselementvariabeleexpressie van een For of For Each lus, of in de hoofdtekst van een SyncLock-instructie .

Uitzonderingen

De meeste asynchrone methoden retourneren een Task of Task<TResult>. De eigenschappen van de geretourneerde taak bevatten informatie over de status en geschiedenis, zoals of de taak is voltooid, of de asynchrone methode een uitzondering heeft veroorzaakt of is geannuleerd en wat het uiteindelijke resultaat is. De Await operator heeft toegang tot deze eigenschappen.

Als u wacht op een asynchrone methode die een uitzondering veroorzaakt door een taak, wordt de uitzondering opnieuw uitgevoerd door de Await operator.

Als u wacht op een asynchrone asynchrone methode die wordt geannuleerd, wordt een AwaitOperationCanceledException.

Eén taak met een defecte status kan meerdere uitzonderingen weerspiegelen. De taak kan bijvoorbeeld het resultaat zijn van een aanroep naar Task.WhenAll. Wanneer u een dergelijke taak wacht, wordt slechts één van de uitzonderingen voor de wachtbewerking uitgevoerd. U kunt echter niet voorspellen welke van de uitzonderingen opnieuw wordt geworpen.

Zie Proberen voor voorbeelden van foutafhandeling in asynchrone methoden ... Vangen... Tot slot verklaring.

Opmerking

Het volgende Voorbeeld van Windows Forms illustreert het gebruik van Await in een asynchrone methode. WaitAsynchronouslyAsync Contrasteert het gedrag van die methode met het gedrag van WaitSynchronously. Zonder een Await operator wordt WaitSynchronously synchroon uitgevoerd ondanks het gebruik van de modifier in de Async definitie en een aanroep naar Thread.Sleep de hoofdtekst.

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

Zie ook