Await – operátor (Visual Basic)

Operátor lze použít Await pro operand v asynchronní metodě nebo výrazu lambda pro pozastavení provádění metody, dokud není dokončen očekávaný úkol. Úkol představuje probíhající práci.

Metoda, ve které Await se používá, musí mít modifikátor Async . Taková metoda, která je definována pomocí Async modifikátoru a obvykle obsahuje jeden nebo více Await výrazů, je označována jako asynchronní metoda.

Poznámka

Klíčová slova Async a Await byla zavedena v sadě Visual Studio 2012. Úvod do asynchronního programování naleznete v tématu asynchronní programování s Async a await.

Úkol, na který operátor použijete, Await je obvykle návratovou hodnotou z volání metody, která implementuje asynchronní vzor založený na úlohách, to znamená, Task nebo Task<TResult> .

V následujícím kódu HttpClient Metoda GetByteArrayAsync vrátí hodnotu getContentsTask , Task(Of Byte()) . Úkol je příslib, který vytvoří skutečné bajtové pole po dokončení operace. AwaitOperátor je použit na getContentsTask pro pozastavení provádění v, SumPageSizesAsync dokud getContentsTask není dokončeno. Mezitím se ovládací prvek vrátí volajícímu SumPageSizesAsync . Po getContentsTask dokončení se Await výraz vyhodnotí jako bajtové pole.

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

Důležité

Úplný příklad najdete v tématu Návod: přístup k webu pomocí modifikátoru Async a operátoru await. Ukázku si můžete stáhnout z prohlížeče ukázek .NET. Vzorový kód je v projektu SerialAsyncExample .

Pokud Await je použita na výsledek volání metody, která vrací Task(Of TResult) , je typ Await výrazu TResult. Pokud Await je použita na výsledek volání metody, která vrací Task , Await výraz nevrátí hodnotu. Rozdíl je znázorněn v následujícím příkladu.

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

AwaitVýraz nebo příkaz neblokuje vlákno, ve kterém je prováděno. Místo toho způsobí, že kompilátor zaregistruje zbytek asynchronní metody za Await výraz, jako pokračování na očekávaném úkolu. Ovládací prvek se pak vrátí volajícímu asynchronní metody. Po dokončení úkolu vyvolá jeho pokračování a spuštění asynchronní metody pokračuje tam, kde skončila.

AwaitVýraz může nastat pouze v těle přímo ohraničující metody nebo lambda výraz, který je označen Async modifikátorem. Termín await slouží jako klíčové slovo pouze v tomto kontextu. Jinde je interpretován jako identifikátor. V rámci Async metody nebo výrazu lambda se Await výraz nemůže vyskytovat ve výrazu dotazu v Catch Finally bloku nebo bloku Try... Zachytit... Finally, ve výrazu řídicí proměnné smyčky For smyčky nebo nebo For Each v těle SyncLock příkazu.

Výjimky

Většina asynchronních metod vrací Task nebo Task<TResult> . Vlastnosti vrácené úlohy obsahují informace o jeho stavu a historii, například o tom, zda je úloha dokončena, zda asynchronní metoda způsobila výjimku nebo byla zrušena a co je konečný výsledek. Tento Await operátor přistupuje k těmto vlastnostem.

Pokud očekáváte asynchronní metodu vracející úlohu, která způsobí výjimku, Await operátor znovu vyvolá výjimku.

Pokud očekáváte asynchronní metodu vracející úlohu, která je zrušena, operátor znovu Await vyvolá OperationCanceledException .

Jeden úkol, který je v chybovém stavu, může odrážet více výjimek. Například úloha může být výsledkem volání metody Task.WhenAll . Pokud očekáváte takovou úlohu, operace Await znovu vyvolá pouze jednu výjimku. Nemůžete však odhadnout, které výjimky jsou znovu vyvolány.

Příklady zpracování chyb v asynchronních metodách naleznete v tématu Try... Zachytit... Finally – příkaz.

Příklad

následující příklad model Windows Forms ukazuje použití Await v asynchronní metodě, WaitAsynchronouslyAsync . Kontrast s chováním této metody s chováním WaitSynchronously . Bez Await operátora WaitSynchronously běží synchronně navzdory použití Async modifikátoru v definici a volání do Thread.Sleep jeho těla.

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

Viz také