Freigeben über


Async (Visual Basic)

Der Modifizierer Async gibt an, dass die von ihm geänderte Methode oder der von ihm geänderte Lambda-Ausdruck asynchron ist. Solche Methoden werden als asynchrone Methoden bezeichnet.

Mit einer Async-Methode können Aufgaben mit potenziell langer Laufzeit auf einfache Weise ausgeführt werden, ohne den Thread des Aufrufers zu blockieren. Der Aufrufer einer Async-Methode kann seine Arbeit fortsetzen, ohne auf die Fertigstellung der Async-Methode zu warten.

Hinweis

Die Schlüsselwörter Async und Await wurden in Visual Studio 2012 eingeführt.Eine Einführung in die Grundlagen der asynchronen Programmierung finden Sie unter Asynchrone Programmierung mit Async und Await (C# und Visual Basic).

Im folgenden Beispiel wird die Struktur einer asynchronen Methode veranschaulicht. Laut Konvention enden die Namen von asynchrone Methoden mit "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 Regel enthält eine Methode, die mit dem Async-Schlüsselwort geändert wird, mindestens einen Await-Ausdruck oder eine Await-Anweisung. Die Methode wird bis zum ersten Await-Ausdruck synchron ausgeführt. Dann wird die Methode angehalten, bis die erwartete Aufgabe abgeschlossen ist. In der Zwischenzeit wird die Steuerung zum Aufrufer der Methode zurückgegeben. Wenn die Methode keinen Await-Ausdruck oder keine Await-Anweisung enthält, wird die Methode nicht angehalten und wie eine synchrone Methode ausgeführt. Mit einer Compilerwarnung werden Sie auf alle Async-Methoden hingewiesen, die kein Await enthalten, da dies möglicherweise auf einen Fehler hindeutet. Weitere Informationen finden Sie unter Compilerfehler.

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

Rückgabetypen

Eine asynchrone Methode ist entweder eine Sub- oder eine Function-Prozedur, die einen Rückgabetyp Task oder Task hat. Die Methode kann keine ByRef-Parameter deklarieren.

Task(Of TResult) wird als Rückgabetyp einer Async-Methode angegeben, wenn die Return-Anweisung der Methode einen Operanden vom Typ TResult enthält. Task wird verwendet, falls kein sinnvoller Wert zurückgegeben wird, wenn die Methode abgeschlossen ist. Das bedeutet, dass ein Aufruf der Methode eine Task zurückgibt, aber wenn die Task abgeschlossen ist, erzeugt eine Await-Anweisung, die Task erwartet, keinen Ergebniswert.

Asynchrone Unterroutinen werden hauptsächlich verwendet, um Ereignishandler zu definieren, in denen eine Sub Prozedur erforderlich ist. Der Aufrufer einer Async-Unterroutine kann diese nicht erwarten und keine Ausnahmen auffangen, die von der Methode ausgelöst werden.

Weitere Informationen und Beispiele finden Sie unter Asynchrone Rückgabetypen (C# und Visual Basic).

Beispiel

In den folgenden Beispielen werden ein asynchroner Ereignishandler, ein asynchroner Lambda-Ausdruck und eine asynchrone Methode dargestellt. Ein vollständiges Beispiel, in dem diese Elemente verwendet werden, finden Sie unter Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic). Sie können den Code der exemplarischen Vorgehensweise auf der Seite für Codebeispiele für Entwickler herunterladen.

' 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

Aufgaben

Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic)

Referenz

Await-Operator (Visual Basic)

AsyncStateMachineAttribute

Konzepte

Asynchrone Programmierung mit Async und Await (C# und Visual Basic)