Sdílet prostřednictvím


Async (Visual Basic)

Modifikátor Async označuje asynchronní metodu nebo výraz lambda.Tyto metody jsou označovány jako asynchronní metody.

Asynchronní metoda poskytuje 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ůžete pokračovat v práci bez čekání na dokončení asynchronní metody.

[!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).

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

Obvykle metoda s klíčovým slovem Async obsahuje nejméně jeden výraz nebo příkaz await.Metoda pracuje synchronně, dokud nedosáhne prvního operátoru Await, v tomto okamžiku se vykonává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 asynchronní metody.Pokud metoda neobsahuje výraz nebo příkaz Await, není vykonávání metody pozastaveno a provede se stejně jako synchronní metoda.Upozornění kompilátoru vás upozorní na jakékoli asynchronní metody, které neobsahují Await, protože tato situace může znamenat chybu.Další informace naleznete v tématu Chyba kompilátoru.

Klíčové slovo Async je nerezervované klíčové slovo.Pokud modifikuje metodu nebo lambda výraz, je klíčovým slovem.Ve všech ostatních kontextech je interpretováno jako identifikátor.

Návratové typy

Asynchronní metoda je buď procedura typu Sub nebo procedura typu Function, která má návratový typ Task nebo typ Task.V takové metodě nelze deklarovat žádné parametry typu ByRef.

Jako návratový typ asynchronní metody lze zadat typ Task(Of TResult), pokud příkaz Return metody obsahuje operand typu TResult.Můžete použít Task, pokud není vrácena žádná smysluplná hodnota po dokončení metody.To znamená, že volání metody vrací typ Task, ale když je typ Task dokončen, všechny příkazy Await čekající na tento typ Task nevrátí výsledek.

Asynchronní podprogramy se používají především pro definování obslužné rutiny události, kde je nutná procedura typu Sub.Volající asynchronního podprogramu ji nemůže očekávat a ani zachytávat výjimky, které tato metoda vyvolá.

Další informace a příklady naleznete v tématu Asynchronní návratové typy (C# and Visual Basic).

Příklad

Následující příklady ukazují asynchronní obslužnou rutinu události, asynchronní výraz lambda a asynchronní metodu.Úplný příklad používající tyto prvky naleznete v tématu Návod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).Můžete si stáhnout instruktážní kód z tématu Ukázky kódu vývojáře.

' 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

Viz také

Úkoly

Návod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic)

Referenční dokumentace

Await – operátor (Visual Basic)

AsyncStateMachineAttribute

Koncepty

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