Async (Visual Basic)
Modyfikator Async
wskazuje, że metoda lub wyrażenie lambda, które modyfikuje, jest asynchroniczne. Takie metody są określane jako metody asynchroniczne.
Metoda asynchronizująca zapewnia wygodny sposób wykonywania potencjalnie długotrwałej pracy bez blokowania wątku obiektu wywołującego. Obiekt wywołujący metodę async może wznowić swoją pracę bez oczekiwania na zakończenie metody asynchronicznej.
Uwaga
Słowa Async
kluczowe i Await
zostały wprowadzone w programie Visual Studio 2012. Aby zapoznać się z wprowadzeniem do programowania asynchronicznego, zobacz Asynchroniczne programowanie z funkcją 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 Async
słowo kluczowe zawiera co najmniej jedno wyrażenie lub instrukcję Await . Metoda jest uruchamiana synchronicznie, dopóki nie osiągnie pierwszego Await
, w którym momencie zawiesza się do momentu zakończenia oczekiwanego zadania. W międzyczasie kontrolka jest zwracana do obiektu wywołującego metodę . Jeśli metoda nie zawiera Await
wyrażenia lub instrukcji, metoda nie jest zawieszona i wykonywana jako 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 jest słowem kluczowym bez zastrzeżeń. Jest to słowo kluczowe, gdy modyfikuje metodę lub wyrażenie lambda. We wszystkich innych kontekstach jest interpretowany jako identyfikator.
Typy zwracane
Metoda asynchronizna jest procedurą podrzędną lub procedurą funkcji, która ma zwracany typ Task lub Task<TResult>. Metoda nie może zadeklarować żadnych parametrów ByRef .
Task(Of TResult)
Określasz typ zwracany metody asynchronicznej, jeśli instrukcja Return metody ma operand typu TResult. Task
Jeśli po zakończeniu metody nie zostanie zwrócona żadna zrozumiała wartość. Oznacza to, że wywołanie metody zwraca Task
wartość , ale po zakończeniu Task
każdej instrukcji, Await
która oczekuje Task
na element , nie generuje wartości wyniku.
Asynchroniczne podprodukty są używane głównie do definiowania procedur, w których jest wymagana Sub
procedura. Obiekt wywołujący podprokutyny asynchronicznej nie może go czekać i nie może przechwycić wyjątków zgłaszanych przez metodę.
Aby uzyskać więcej informacji i przykładów, zobacz Async Return Types (Typy zwracane asynchroniczne).
Przykład
W poniższych przykładach przedstawiono procedurę obsługi zdarzeń asynchronicznych, asynchroniczne wyrażenie lambda i metodę asynchroniową. Aby zapoznać się z pełnym przykładem, który używa tych elementów, zobacz Przewodnik: uzyskiwanie dostępu do sieci Web przy użyciu Async i Await. Przykład można 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