Sdílet prostřednictvím


Await – operátor (Visual Basic)

Operátor Await lze použít s operandem v asynchronní metodě a výrazu lambda k pozastavení provádění metody, dokud očekávaná úloha neskončí.Úloha představuje probíhající práci.

Metoda, ve které je operátor Await použit, musí používat modifikátor Async.Tato metoda, definována pomocí modifikátoru Async, a obvykle obsahuje jeden nebo více výrazů Await, které jsou označovány jako asynchronní metoda.

[!POZNÁMKA]

Klíčová slova Async a Await byla zavedena v aplikaci Visual Studio 2012.Úvod do asynchronního programování naleznete zde: Asynchronní programování pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).

Obvykle je tento úkol, na který je použit operátor Await, vrácenou hodnotou z volání metody, která implementuje Asynchronního vzoru zpracování úloh, tj. typ Task nebo Task.

V následujícím kódu metoda GetByteArrayAsync třídy HttpClient vrátí proměnnou getContentsTask typu Task(Of Byte()).Úkol po dokončení operace vytvoří pole bajtů.Operátor Await je použit na getContentsTask k pozastavení provádění v SumPageSizesAsync až do dokončení getContentsTask.Mezitím se ovládací prvek vrátí volajícímu metody SumPageSizesAsync.Když je getContentsTask dokončeno, výraz Await je 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é

Úplný příklad naleznete v tématu Návod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).Ukázku si můžete stáhnout na stránkách Ukázky kódu vývojáře na webu společnosti Microsoft.Příklad je v projektu AsyncWalkthrough_HttpClient.

Pokud se operátor Await aplikuje na výsledek volání metody, která vrací typ Task(Of TResult), potom je výraz Await typu TResult.Pokud se operátor Await aplikuje na výsledek volání metody, která vrací typ Task, nevrací výraz Await žádnou 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()

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

Výraz Await se může objevit pouze v těle těsně uzavírajícím metodu nebo výraz lambda označený modifikátorem Async.Termín Await slouží jako klíčové slovo pouze v tomto kontextu.Jinde je interpretován jako identifikátor.V asynchronní metodě nebo výrazu lambda nemůže být výraz Await použit ve výrazu dotazu, v bloku catch nebo v bloku finally příkazu Try...Catch...Finally, v řídící proměnné cyklu For nebo cyklu For Each nebo v těle příkazu SyncLock.

Výjimky

Většina asynchronních metod vrátí Task nebo Task.Vlastnosti vrácené úlohy nesou informaci o jejím stavu a historii, např. zda je úkol dokončen, zda asynchronní metoda způsobila výjimku nebo byla zrušena a co je konečný výsledek.Operátor Await má přístup k těmto vlastnostem.

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

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

Jediný úkol, který je v chybovém stavu, může odrážet více výjimek. Úkol může být například výsledek volání do Task.WhenAll.Když budete očekávat takový úkol, operace await vrátí pouze jednu z výjimek.Nelze však předpovědět, které výjimky budou znovu vyvolány.

Příklady zpracování chyb v asynchronních metodách naleznete zde: Try...Catch....Finally – příkaz (Visual Basic).

Příklad

Následující příklad Windows Forms ukazuje použití Await v asynchronní metodě, WaitAsynchronouslyAsync.Kontrast v chování dané metody s chováním WaitSynchronously.Bez použití operátoru Await pracuje metoda WaitSynchronously synchronně bez ohledu na použití modifikátoru Async v její definici a volání metody Thread.Sleep v jejím těle.

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ávod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic)

Referenční dokumentace

Async (Visual Basic)

Koncepty

Asynchronní programování pomocí modifikátoru Async a operátoru Await (C# a Visual Basic)