Sdílet prostřednictvím


Vyčkání operátor (Visual Basic)

Můžete použít Await operátor operand v asynchronní metoda nebo lambda výraz pozastavení provádění metody, až po dokončení úkolu awaited.Úloha představuje probíhající práce.

Metoda, ve kterém Await se používá musí mít asynchronní modifikátor.Tato metoda, definovány pomocí Async modifikátor a obvykle obsahuje jeden nebo více Await výrazy, se nazývá asynchronní metody.

[!POZNÁMKA]

Async a Await klíčová slova, které byly zavedeny v aplikaci Visual Studio 2012.Informace o nových funkcích v této verzi naleznete v tématu Novinky v sadě Visual Studio 2012.

Úvod do programování asynchronní, viz Asynchronní asynchronní pro programování a očekávat (C# a Visual Basic).

Obvykle úkol, ke kterému se vztahují Await operátor je návratová hodnota z volání metody, která implementuje asynchronní programování založené na úkolu, který je Task nebo Task<TResult>.

Následující kód HttpClient metoda GetByteArrayAsync vrátí getContentsTask, Task(Of Byte()).Úkol je promise vyrábět skutečné bajtové pole po dokončení operace.Await Je použit operátor getContentsTask k pozastavení provádění v SumPageSizesAsync až getContentsTask je dokončena.Do té doby řízení je vráceno z SumPageSizesAsync.Při getContentsTask je dokončena, Await je výraz vyhodnocen 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á poznámkaDůležité

Pro plný příklad, viz Názorný postup: Přístup K webu pomocí asynchronní a vyčkání (C# a Visual Basic). Můžete stáhnout ukázky z Developer ukázky kódu na webu společnosti Microsoft.V příkladu je v projektu AsyncWalkthrough_HttpClient.

Pokud Await je použit výsledek volání metody, která vrací Task(Of TResult), typ Await je výraz TResult.Pokud Await je použit výsledek volání metody, která vrací Task, Await výraz nevrací hodnotu.Následující příklad ukazuje rozdíl.

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

Await Výrazu nebo příkazu neblokuje vlákno, na kterém je vykonáván.Místo toho způsobí kompilátor zapsat se po zbytek asynchronní metody Await výraz jako pokračování na awaited úkolu.Ovládací prvek vrátí k volání asynchronní metody.Po dokončení úkolu vyvolá jeho pokračování a provádění asynchronní metody životopisy, kde byl přerušen.

Await Výrazu může dojít pouze v těle okamžitě ohraničující metoda nebo lambda výraz, který je označen Async modifikátor.Termín Await slouží jako klíčové slovo pouze v této souvislosti.Jinde je interpretován jako identifikátor.V rámci asynchronní metoda nebo lambda výrazu Await výrazu nelze provést ve výrazu dotazu v catch nebo finally blokovat z Try...Úlovek...Nakonec prohlášení v cyklu ovládacího prvku proměnné vyjádření For nebo For Each smyčky, nebo v textu SyncLock prohlášení.

Výjimky

Většina asynchronní metody vrátí Task nebo Task<TResult>.Vlastnosti vrácených úkolů nesou informaci o jeho stavu a historie, například zda je úkol dokončen, zda se asynchronní metody došlo k výjimce, nebo byla zrušena a jaké konečný výsledek je.Await Operátor má přístup k těmto vlastnostem.

Je-li očekávat vrácením úkolu asynchronní metodu, která způsobí výjimku, Await operátor vyvolá výjimku.

Je-li očekávat vrácením úkolu asynchronní metody, která je zrušena, Await operátor vyvolá OperationCanceledException.

Jeden úkol, který je ve stavu může odpovídat více výjimek.Úkol může být například výsledek volání Task.WhenAll.Když vyčkání takových úloh, vyvolá await operace pouze některá z výjimek.Však nemůžete předpovědět, který výjimky vyvolány.

Příklady zpracování chyb v asynchronní metody naleznete v tématu Zkuste...Úlovek...Nakonec prohlášení (Visual Basic).

Příklad

Model Windows Forms tento příklad ukazuje použití Await v asynchronní metody, WaitAsynchronouslyAsync.Kontrast chování této metody s z WaitSynchronously.Bez Await operátor, WaitSynchronously pracuje synchronně navzdory použití Async modifikátor v jeho definici a volání Thread.Sleep v jeho textu.

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é

Úkoly

Názorný postup: Přístup K webu pomocí asynchronní a vyčkání (C# a Visual Basic)

Referenční dokumentace

Asynchronní (Visual Basic)

Koncepty

Asynchronní asynchronní pro programování a očekávat (C# a Visual Basic)