Await – operátor (Visual Basic)
Operátor použijete Await
u operandu v asynchronní metodě nebo výrazu lambda k pozastavení provádění metody, dokud se nedokončí 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 definovaná pomocí modifikátoru Async
a obvykle obsahující jeden nebo více Await
výrazů se označuje jako asynchronní metoda.
Poznámka:
Klíčová slova Async
a Await
byla zavedena v sadě Visual Studio 2012. Úvod do asynchronního programování najdete v tématu Asynchronní programování pomocí Async a Await.
Úloha, na kterou použijete Await
operátor, je obvykle návratovou hodnotou volání metody, která implementuje asynchronní vzor založený na úlohách, tj. a Task nebo Task<TResult>.
V následujícím kódu HttpClient metoda GetByteArrayAsync vrátí getContentsTask
, a Task(Of Byte())
. Úkol je slib, že po dokončení operace vytvoří skutečné pole bajtů. Operátor Await
se použije k getContentsTask
pozastavení provádění SumPageSizesAsync
až do getContentsTask
dokončení. Do té doby 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 naleznete v části Návod: Přístup k webu pomocí Async a Await. Ukázku si můžete stáhnout z ukázkového prohlížeče .NET. Ukázkový kód je v projektu SerialAsyncExample .
Pokud Await
je použita na výsledek volání metody, která vrací Task(Of TResult)
, typ Await
výrazu je TResult. Pokud Await
se použije na výsledek volání metody, která vrací hodnotu Task
, Await
výraz nevrací hodnotu. Následující příklad znázorňuje 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()
Výraz Await
nebo příkaz neblokuje vlákno, na kterém se spouští. Místo toho způsobí, že se kompilátor zaregistruje zbytek asynchronní metody za Await
výrazem jako pokračování očekávané úlohy. Ovládací prvek se pak vrátí volajícímu asynchronní metody. Po dokončení úlohy vyvolá pokračování a spuštění asynchronní metody pokračuje tam, kde skončil.
Výraz Await
může nastat pouze v těle bezprostředně uzavřené metody nebo výrazu lambda, který je označen modifikátorem Async
. Termín Await slouží pouze jako klíčové slovo v tomto kontextu. Jinde se interpretuje jako identifikátor. Ve výrazu Async
metody nebo výrazu Await
lambda nemůže výraz nastat ve výrazu dotazu, v Catch
Finally
bloku příkazu Try... Chytit... Příkaz Finally, ve výrazu For
proměnné smyčky řízení nebo For Each
smyčky nebo v těle příkazu SyncLock .
Výjimky
Většina asynchronních metod vrací metodu Task nebo Task<TResult>. Vlastnosti vrácené úlohy obsahují informace o svém stavu a historii, například o tom, zda je úkol dokončen, zda asynchronní metoda způsobila výjimku nebo byla zrušena a jaký je konečný výsledek. Operátor Await
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 vrácenou úlohou, která je zrušena, Await
operátor znovu načítá OperationCanceledException.
Jeden úkol, který je v chybném stavu, může odrážet více výjimek. Například úkol může být výsledkem volání Task.WhenAll. Když na takový úkol čekáte, operace await znovu zvětšuje pouze jednu z výjimek. Nemůžete ale předpovědět, která z výjimek se znovu zřetědí.
Příklady zpracování chyb v asynchronních metodách najdete v tématu Try... Chytit... Příkaz Finally.
Příklad
Následující model Windows Forms příklad ukazuje použití Await
v asynchronní metodě , WaitAsynchronouslyAsync
. Kontrast chování této metody s chováním WaitSynchronously
. Bez operátoru Await
se WaitSynchronously
spouští synchronně i přes použití modifikátoru Async
v jeho definici a volání Thread.Sleep v 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