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 getContentsTask
de 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 Task
retourneert, 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 Await
OperationCanceledException.
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