Udostępnij za pośrednictwem


Async (Visual Basic)

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

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

[!UWAGA]

Słowa kluczowe Async i Await wprowadzono w programie Visual Studio 2012.Aby przeczytać wprowadzenie do programowania asynchronicznego, zobacz Programowanie asynchroniczne z Async i Await (C# i Visual Basic).

Poniższy przykład pokazuje strukturę metody asynchronicznej.Umownie 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 modyfikowana przez słowo kluczowe Async zawiera przynajmniej jedno wyrażenie lub instrukcję Await.Metoda jest uruchamiana synchronicznie, aż do napotkania pierwszego polecenia Await, kiedy zawiesza pracę w oczekiwaniu na ukończenie oczekiwanego zadania.W międzyczasie, kontrola jest zwracana do wywołującego metodę.Jeśli metoda nie zawiera wyrażenia lub instrukcji Await, nie jest zawieszana i wykonuje się tak jak metoda synchroniczna.Ostrzeżenia kompilatora ostrzega przed wszystkimi metodami asynchronicznymi, które nie zawierają Await , ponieważ taka sytuacja może wskazywać na błąd.Aby uzyskać więcej informacji, zobacz błąd kompilatora.

Słowo kluczowe Async jest niezastrzeżonym słowem kluczowym.Jest to słowo kluczowe, gdy modyfikuje metodę lub wyrażenie lambda.W innych kontekstach jest interpretowane jako identyfikator.

Typy zwracane

Metoda asynchroniczna jest albo Sub procedurą albo procedurą Funkcji, która ma typ zwracany Task lub Task.Metoda nie może deklarować żadnych parametrów ByRef.

Należy określić Task(Of TResult) jako typ zwrotny metody asynchronicznej, jeśli instrukcja Return metody posiada argument operacji typu TResult.Jeśli żadna mająca znaczenie wartość nie zostanie zwrócona, gdy metoda zostanie zakończona, należy użyć Task.Oznacza to, że wywołanie metody zwraca Task, ale kiedy Task jest ukończone, wszelkie instrukcje Await oczekujące na Task nie wytworzą wartości wynikowej.

Podprocedury asynchroniczne są używane głównie do definiowania obsługi zdarzeń, w których wymagana jest Sub procedura.Obiekt wywołujący podprocedurę asynchroniczną nie może oczekiwać i nie może przechwytywać wyjątków, które metoda wygeneruje.

Aby uzyskać więcej informacji i przykładów, zobacz Asynchroniczne typy zwracane (C# i Visual Basic).

Przykład

Następujące przykłady przedstawiają program obsługi zdarzeń asynchronicznych, asynchroniczne wyrażenie lambda i metodę asynchroniczną.Aby uzyskać pełny przykład używający tych elementów, zobacz Wskazówki: uzyskiwanie dostępu do sieci za pomocą Async i Await (C# i Visual Basic).Możesz pobrać kod przejściowy z Próbki kodu deweloperskiego.

' 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ż

Zadania

Wskazówki: uzyskiwanie dostępu do sieci za pomocą Async i Await (C# i Visual Basic)

Informacje

Await — Operator (Visual Basic)

AsyncStateMachineAttribute

Koncepcje

Programowanie asynchroniczne z Async i Await (C# i Visual Basic)