Await-operator (Visual Basic)
Du använder operatorn Await
på en operand i en asynkron metod eller lambda-uttryck för att pausa körningen av metoden tills den väntande aktiviteten har slutförts. Uppgiften representerar pågående arbete.
Metoden som Await
används måste ha en Async-modifierare . En sådan metod, som definieras med hjälp Async
av modifieraren och vanligtvis innehåller ett eller flera Await
uttryck, kallas för en asynkron metod.
Kommentar
Nyckelorden Async
och Await
introducerades i Visual Studio 2012. En introduktion till asynkron programmering finns i Asynkron programmering med Async och Await.
Den uppgift som du använder operatorn Await
för är vanligtvis returvärdet från ett anrop till en metod som implementerar det aktivitetsbaserade asynkrona mönstret, det vill säga en Task eller ett Task<TResult>.
I följande kod HttpClient returnerar getContentsTask
metoden GetByteArrayAsync , en Task(Of Byte())
. Uppgiften är ett löfte om att skapa den faktiska bytematrisen när åtgärden är klar. Operatorn Await
tillämpas på för att getContentsTask
pausa körningen tills SumPageSizesAsync
getContentsTask
den är klar. Under tiden returneras kontrollen till anroparen för SumPageSizesAsync
. När getContentsTask
är klart Await
utvärderas uttrycket till en bytematris.
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
Viktigt!
Det fullständiga exemplet finns i Genomgång: Åtkomst till webben med hjälp av Async och Await. Du kan ladda ned exemplet från .NET Sample Browser. Exempelkoden finns i SerialAsyncExample-projektet .
Om Await
tillämpas på resultatet av ett metodanrop som returnerar ett Task(Of TResult)
är uttryckets Await
typ TResult. Om Await
tillämpas på resultatet av ett metodanrop som returnerar ett Task
returnerar Await
uttrycket inte ett värde. I följande exempel visas skillnaden.
' 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()
Ett Await
uttryck eller uttryck blockerar inte den tråd som den körs på. I stället gör det att kompilatorn registrerar resten av asynkronmetoden efter Await
uttrycket som en fortsättning på den väntade aktiviteten. Kontrollen återgår sedan till anroparen för async-metoden. När aktiviteten har slutförts anropas dess fortsättning och körningen av async-metoden återupptas där den slutade.
Ett Await
uttryck kan bara förekomma i brödtexten för en omedelbar omslutande metod eller lambda-uttryck som markeras av en Async
modifierare. Termen Await fungerar endast som ett nyckelord i den kontexten. På andra ställen tolkas det som en identifierare. Async
I -metoden eller lambda-uttrycket kan ett Await
uttryck inte förekomma i ett frågeuttryck, i Catch
eller Finally
i ett Try... Fånga... Slutligen-instruktion i loopkontrollvariabeluttrycket för en For
eller For Each
-loop, eller i brödtexten i en SyncLock-instruktion.
Undantag
De flesta asynkrona metoder returnerar en Task eller Task<TResult>. Egenskaperna för den returnerade aktiviteten innehåller information om dess status och historik, till exempel om aktiviteten är slutförd, om asynkron metoden orsakade ett undantag eller avbröts och vad slutresultatet är. Operatorn Await
kommer åt dessa egenskaper.
Om du väntar på en aktivitetsreturerande asynkron metod som orsakar ett undantag, så överväxlar operatorn Await
undantaget igen.
Om du väntar på en aktivitetsreturerande asynkron metod som avbryts, så överväxlar operatorn Await
en OperationCanceledException.
En enskild uppgift som är i ett felaktigt tillstånd kan återspegla flera undantag. Uppgiften kan till exempel vara resultatet av ett anrop till Task.WhenAll. När du väntar på en sådan uppgift, återväxar inväntningsåtgärden bara ett av undantagen. Du kan dock inte förutsäga vilka av undantagen som är återväxta.
Exempel på felhantering i asynkrona metoder finns i Prova... Fånga... Slutligen -instruktion.
Exempel
Följande Windows Forms-exempel illustrerar användningen av Await
i en asynkron metod, WaitAsynchronouslyAsync
. Kontrastera beteendet för metoden med beteendet WaitSynchronously
för . Utan en Await
operator WaitSynchronously
körs synkront trots att modifieraren används Async
i dess definition och ett anrop till Thread.Sleep i dess brödtext.
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