Async (Visual Basic)
Async
Modifikátor označuje, že metoda nebo výraz lambda, který upravuje, je asynchronní. Takové metody se označují jako asynchronní metody.
Asynchronní metoda představuje pohodlný způsob, jak provádět potenciálně dlouhotrvající práci bez blokování vlákna volání. Volající asynchronní metody může pokračovat v práci bez čekání na dokončení metody.
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.
Následující příklad ukazuje strukturu asynchronní metody. Podle úmluvy názvy asynchronních metod končí slovem „Async“.
Public Async Function ExampleMethodAsync() As Task(Of Integer)
' . . .
' At the Await expression, execution in this method is suspended and,
' if AwaitedProcessAsync has not already finished, control returns
' to the caller of ExampleMethodAsync. When the awaited task is
' completed, this method resumes execution.
Dim exampleInt As Integer = Await AwaitedProcessAsync()
' . . .
' The return statement completes the task. Any method that is
' awaiting ExampleMethodAsync can now get the integer result.
Return exampleInt
End Function
Metoda upravená klíčovým slovem Async
obvykle obsahuje alespoň jeden výraz nebo příkaz Await . Metoda pracuje synchronně, dokud nedosáhne prvního operátoru Await
. V tomto okamžiku se provádění metody pozastaví až do dokončení očekávané úlohy. Během této doby je řízení předáno zpět volajícímu metody. Pokud metoda neobsahuje Await
výraz nebo příkaz, metoda není pozastavená a spustí se jako synchronní metoda. Upozornění kompilátoru vás upozorní na jakékoli asynchronní metody, které neobsahují slovo Await
, protože tato situace může značit chybu. Další informace najdete v chybě kompilátoru.
Klíčové slovo Async
je nerezervované klíčové slovo. Pokud modifikuje metodu nebo výraz lambda, je klíčovým slovem. Ve všech ostatních kontextech je interpretováno jako identifikátor.
Návratové typy
Asynchronní metoda je buď Sub procedura, nebo Function procedura, která má návratový Task typ nebo Task<TResult>. Metoda nemůže deklarovat žádné parametry ByRef .
Pro návratový typ asynchronní metody zadáte Task(Of TResult)
, pokud příkaz Return metody má operand typu TResult. Použijete Task
, pokud se po dokončení metody nevrátí žádná smysluplná hodnota. To znamená, že volání metody vrací typ Task
, ale když je typ Task
dokončen, žádný z příkazů Await
čekajících na tento typ Task
nevrátí výsledek.
Asynchronní podprogramy se používají především pro definování obslužných rutin událostí, kde je nutná procedura Sub
. Volající asynchronního podprogramu ji nemůže očekávat ani zachytávat výjimky, které tato metoda vyvolá.
Další informace a příklady najdete v tématu Asynchronní návratové typy.
Příklad
Následující příklady ukazují asynchronní obslužnou rutinu události, asynchronní výraz lambda a asynchronní metodu. Úplný příklad, který používá tyto prvky, 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 .
' An event handler must be a Sub procedure.
Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click
textBox1.Clear()
' SumPageSizesAsync is a method that returns a Task.
Await SumPageSizesAsync()
textBox1.Text = vbCrLf & "Control returned to button1_Click."
End Sub
' The following async lambda expression creates an equivalent anonymous
' event handler.
AddHandler button1.Click, Async Sub(sender, e)
textBox1.Clear()
' SumPageSizesAsync is a method that returns a Task.
Await SumPageSizesAsync()
textBox1.Text = vbCrLf & "Control returned to button1_Click."
End Sub
' The following async method returns a Task(Of T).
' A typical call awaits the Byte array result:
' Dim result As Byte() = Await GetURLContents("https://msdn.com")
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())
' The downloaded resource ends up in the variable named content.
Dim content = New MemoryStream()
' Initialize an HttpWebRequest for the current URL.
Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)
' Send the request to the Internet resource and wait for
' the response.
Using response As WebResponse = Await webReq.GetResponseAsync()
' Get the data stream that is associated with the specified URL.
Using responseStream As Stream = response.GetResponseStream()
' Read the bytes in responseStream and copy them to content.
' CopyToAsync returns a Task, not a Task<T>.
Await responseStream.CopyToAsync(content)
End Using
End Using
' Return the result as a byte array.
Return content.ToArray()
End Function