Async (Visual Basic)

Modyfikator wskazuje, że metoda lub wyrażenie Async lambda, które modyfikuje, jest asynchroniczne. Takie metody są określane jako metody asynchroniczne.

Metoda asynchroniczna zapewnia wygodny sposób na potencjalnie długotrwałą pracę bez blokowania wątku wywołującego. Element wywołujący metodę asynchroniczną może wznowić pracę bez oczekiwania na zakończenie metody asynchronicznej.

Uwaga

Słowa Async kluczowe i zostały wprowadzone w Visual Studio Await 2012 r. Aby uzyskać wprowadzenie do programowania asynchronicznego, zobacz Asynchronous Programming with Async and Await (Programowanie asynchroniczne z Async i Await).

W poniższym przykładzie przedstawiono strukturę metody asynchronicznej. Zgodnie z konwencją nazwy metod asynchronicznych kończą się 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

Zazwyczaj metoda zmodyfikowana przez słowo kluczowe Async zawiera co najmniej jedno wyrażenie await lub instrukcje . Metoda jest uruchamiana synchronicznie do momentu osiągnięcia pierwszego , po czym zawiesza się do momentu ukończenia Await oczekiwanego zadania. W międzyczasie sterowanie jest zwracane do wywołującego metody . Jeśli metoda nie zawiera wyrażenia lub instrukcji , metoda nie jest wstrzymana i jest wykonywana jako Await metoda synchroniczna. Ostrzeżenie kompilatora ostrzega o wszelkich metodach asynchronicznych, które nie zawierają, Await ponieważ taka sytuacja może wskazywać błąd. Aby uzyskać więcej informacji, zobacz błąd kompilatora.

Słowo Async kluczowe to niezarezerwowane słowo kluczowe. Jest to słowo kluczowe, gdy modyfikuje metodę lub wyrażenie lambda. We wszystkich innych kontekstach jest on interpretowany jako identyfikator.

Typy zwracane

Metoda asynchroniczna jest procedurą Sub lub procedurą funkcji, która ma zwracany typ Task lub Task<TResult> . Metoda nie może zadeklarować żadnych parametrów ByRef.

Należy określić zwracany typ metody asynchronicznej, jeśli instrukcja Return metody ma Task(Of TResult) operand typu TResult. Użyj, jeśli po zakończeniu metody nie zostanie Task zwrócona żadna zrozumiała wartość. Oznacza to, że wywołanie metody zwraca wartość , ale po zakończeniu instrukcji każda instrukcja oczekująca na metodę nie zwraca Task Task wartości Await Task wyniku.

Podprogramy asynchroniczne są używane głównie do definiowania procedur obsługi zdarzeń, gdy Sub procedura jest wymagana. Element wywołujący podroutine asynchronicznej nie może na niego czekać i nie może przechwycić wyjątków zgłaszanych przez metodę.

Aby uzyskać więcej informacji i przykładów, zobacz Asynchroniczne typy zwracane.

Przykład

W poniższych przykładach przedstawiono asynchroniczną obsługę zdarzeń, asynchroniczne wyrażenie lambda i metodę asynchroniczną. Pełny przykład korzystający z tych elementów można znaleźć w te tematach: Walkthrough: Accessing the Web by Using Async and Await (Przewodnik:uzyskiwanie dostępu do Sieci za pomocą Async i Await). Przykład możesz pobrać z przykładowej przeglądarki .NET. Przykładowy kod znajduje się w projekcie 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

Zobacz też