Freigeben über


Async (Visual Basic)

Der Async Modifizierer gibt an, dass die Methode oder der Lambda-Ausdruck , den sie ändert, asynchron ist. Solche Methoden werden als asynchrone Methoden bezeichnet.

Eine asynchrone Methode bietet eine bequeme Möglichkeit, potenziell lange ausgeführte Aufgaben auszuführen, ohne den Thread des Aufrufers zu blockieren. Der Aufrufer einer asynchronen Methode kann seine Arbeit fortsetzen, ohne auf den Abschluss der asynchronen Methode zu warten.

Hinweis

Die Async Schlüsselwörter und Await Schlüsselwörter wurden in Visual Studio 2012 eingeführt. Eine Einführung in die asynchrone Programmierung finden Sie unter "Async" und "Await".

Das folgende Beispiel zeigt die Struktur einer asynchronen Methode. Standardmäßig enden asynchrone Methodennamen in "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

In der Async Regel enthält eine vom Schlüsselwort geänderte Methode mindestens einen Await-Ausdruck oder eine Anweisung. Die Methode wird synchron ausgeführt, bis sie den ersten Awaiterreicht, an dem er angehalten wird, bis die erwartete Aufgabe abgeschlossen ist. In der Zwischenzeit wird das Steuerelement an den Aufrufer der Methode zurückgegeben. Wenn die Methode keinen Ausdruck oder eine Await Anweisung enthält, wird die Methode nicht angehalten und als synchrone Methode ausgeführt. Eine Compilerwarnung warnt Sie bei asynchronen Methoden, die nicht enthalten Await sind, da diese Situation möglicherweise auf einen Fehler hinweist. Weitere Informationen finden Sie im Compilerfehler.

Das Async Schlüsselwort ist ein nicht reserviertes Schlüsselwort. Es handelt sich um ein Schlüsselwort, wenn eine Methode oder ein Lambda-Ausdruck geändert wird. In allen anderen Kontexten wird sie als Bezeichner interpretiert.

Rückgabetypen

Eine asynchrone Methode ist entweder eine Sub-Prozedur oder eine Function-Prozedur mit einem Rückgabetyp Task oder Task<TResult>. Die Methode kann keine ByRef-Parameter deklarieren.

Sie geben für den Rückgabetyp einer asynchronen Methode an Task(Of TResult) , wenn die Return-Anweisung der Methode über einen Operanden vom Typ TResult verfügt. Task wird verwendet, falls kein sinnvoller Wert zurückgegeben wird, wenn die Methode abgeschlossen ist. Das heißt, ein Aufruf der Methode gibt einen Task, aber wenn der Task Vorgang abgeschlossen ist, erzeugt jede Await Anweisung, die auf den Task Ergebniswert wartet, keinen Ergebniswert.

Asynchrone Subroutinen werden in erster Linie verwendet, um Ereignishandler zu definieren, bei denen eine Sub Prozedur erforderlich ist. Der Aufrufer einer asynchronen Unterroutine kann nicht darauf warten und kann keine Ausnahmen abfangen, die von der Methode ausgelöst werden.

Weitere Informationen und Beispiele finden Sie unter Asynchrone Rückgabetypen.

Beispiel

Die folgenden Beispiele zeigen einen asynchronen Ereignishandler, einen asynchronen Lambda-Ausdruck und eine asynchrone Methode. Ein vollständiges Beispiel, in dem diese Elemente verwendet werden, finden Sie unter Walkthrough: Accessing the Web by Using Async and Await.For a full example that uses these elements, see Walkthrough: Accessing the Web by Using Async and Await. Sie können das Beispiel aus dem .NET-Beispielbrowser herunterladen. Der Beispielcode befindet sich im SerialAsyncExample-Projekt.

' 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

Siehe auch