Async (Visual Basic)
De Async
wijzigingsfunctie geeft aan dat de methode of lambda-expressie die wordt gewijzigd asynchroon is. Dergelijke methoden worden asynchrone methoden genoemd.
Een asynchrone methode biedt een handige manier om potentieel langlopend werk uit te voeren zonder de thread van de beller te blokkeren. De aanroeper van een asynchrone methode kan het werk hervatten zonder te wachten tot de asynchrone methode is voltooid.
Notitie
De Async
trefwoorden en Await
trefwoorden zijn geïntroduceerd in Visual Studio 2012. Zie Asynchrone programmering met Asynchroon programmeren en Await voor een inleiding tot asynchrone programmering.
In het volgende voorbeeld ziet u de structuur van een asynchrone methode. Volgens conventie eindigen asynchrone methodenamen 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
Normaal gesproken bevat een methode die door het Async
trefwoord is gewijzigd ten minste één Await-expressie of -instructie. De methode wordt synchroon uitgevoerd totdat deze de eerste Await
bereikt, waarna deze wordt onderbroken totdat de wachtende taak is voltooid. Ondertussen wordt het besturingselement teruggezet naar de aanroeper van de methode. Als de methode geen expressie of instructie bevat Await
, wordt de methode niet onderbroken en uitgevoerd als een synchrone methode. Een compilerwaarschuwing waarschuwt u voor asynchrone methoden die niet bevatten Await
, omdat deze situatie mogelijk een fout aangeeft. Zie de compilerfout voor meer informatie.
Het Async
trefwoord is een niet-gereserveerd trefwoord. Het is een trefwoord wanneer een methode of een lambda-expressie wordt gewijzigd. In alle andere contexten wordt deze geïnterpreteerd als een id.
Retourtypen
Een asynchrone methode is een subprocedure of een functieprocedure met een retourtype Task of Task<TResult>. De methode kan geen ByRef-parameters declareren.
U geeft op Task(Of TResult)
voor het retourtype van een asynchrone methode als de Return-instructie van de methode een operand van het type TResult heeft. U gebruikt Task
als er geen zinvolle waarde wordt geretourneerd wanneer de methode is voltooid. Dat wil zeggen dat een aanroep van de methode een Task
, maar wanneer de Task
bewerking is voltooid, een Await
instructie die wacht op de Task
methode, geen resultaatwaarde oplevert.
Asynchrone subroutines worden voornamelijk gebruikt om gebeurtenis-handlers te definiëren waarbij een Sub
procedure is vereist. De aanroeper van een asynchrone subroutine kan er niet op wachten en kan geen uitzonderingen vangen die de methode genereert.
Zie Asynchrone retourtypen voor meer informatie en voorbeelden.
Opmerking
In de volgende voorbeelden ziet u een asynchrone gebeurtenishandler, een asynchrone lambda-expressie en een asynchrone methode. Zie Walkthrough: Accessing the Web by Using Async and Await voor een volledig voorbeeld dat gebruikmaakt van deze elementen. U kunt het voorbeeld downloaden vanuit de .NET-voorbeeldbrowser. De voorbeeldcode bevindt zich in het SerialAsyncExample-project .
' 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