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 getContentsTaskmetoden 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 SumPageSizesAsyncgetContentsTask 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 Taskreturnerar 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 WaitSynchronouslyfö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

Se även