Sdílet prostřednictvím


Asynchronní (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 poskytuje pohodlný způsob, jak provádět potenciálně dlouho běžící práci bez blokování vlákna volajícího. Volající asynchronní metody může pokračovat v práci bez čekání na dokončení asynchronní metody.

Poznámka:

Klíčová slova Async a Await byla představena 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 konvence končí názvy asynchronních metod na "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 se spouští synchronně, dokud nedosáhne prvního Await, v jakém okamžiku pozastaví, dokud se očekávaný úkol dokončí. Do té doby se ovládací prvek vrá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 všechny asynchronní metody, které neobsahují Await , protože tato situace může znamenat chybu. Další informace najdete v chybě kompilátoru.

Klíčové Async slovo je neohraděné klíčové slovo. Jedná se o klíčové slovo při úpravě metody nebo výrazu lambda. Ve všech ostatních kontextech se interpretuje 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 vrátí Taskhodnotu , ale když Task je dokončena, jakýkoli Await příkaz, který čeká na Task výslednou hodnotu.

Asynchronní podprogramy se používají především k definování obslužných rutin událostí, u kterých se vyžaduje procedura Sub . Volající asynchronního podprogramu nemůže očekávat a nemůže zachytit výjimky, které 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

Viz také