Async (Visual Basic)
Modifieraren Async
anger att metoden eller lambda-uttrycket som den ändrar är asynkront. Sådana metoder kallas asynkrona metoder.
En asynkron metod är ett bekvämt sätt att utföra potentiellt tidskrävande arbete utan att blockera anroparens tråd. Anroparen för en asynkron metod kan återuppta sitt arbete utan att vänta på att async-metoden ska slutföras.
Kommentar
Nyckelorden Async
och Await
introducerades i Visual Studio 2012. En introduktion till asynkron programmering finns i Asynkron programmering med Async och Await.
I följande exempel visas strukturen för en asynkron metod. Enligt konventionen slutar asynkrona metodnamn i "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
En metod som ändras av nyckelordet Async
innehåller vanligtvis minst ett Await-uttryck eller -uttryck. Metoden körs synkront tills den når den första Await
, då den pausas tills den väntade aktiviteten har slutförts. Under tiden returneras kontrollen till anroparen för metoden. Om metoden inte innehåller ett uttryck eller uttryck Await
pausas inte metoden och körs som en synkron metod gör. En kompilatorvarning varnar dig om asynkrona metoder som inte innehåller Await
eftersom den situationen kan tyda på ett fel. Mer information finns i kompilatorfelet.
Nyckelordet Async
är ett oreserverat nyckelord. Det är ett nyckelord när det ändrar en metod eller ett lambda-uttryck. I alla andra sammanhang tolkas det som en identifierare.
Returtyper
En asynkron metod är antingen en underprocedur eller en funktionsprocedur som har returtypen Task eller Task<TResult>. Metoden kan inte deklarera några ByRef-parametrar .
Du anger Task(Of TResult)
för returtypen för en asynkron metod om retursatsen för metoden har en operand av typen TResult. Du använder Task
om inget meningsfullt värde returneras när metoden har slutförts. Det vill säga att ett anrop till metoden returnerar ett Task
, men när Task
den har slutförts genererar inte någon Await
-instruktion som väntar på Task
resultatvärdet.
Asynkrona underrutiner används främst för att definiera händelsehanterare där en Sub
procedur krävs. Anroparen för en asynkron underrutin kan inte vänta på den och kan inte fånga undantag som metoden genererar.
Mer information och exempel finns i Async Return Types (Async Return Types).
Exempel
I följande exempel visas en asynkron händelsehanterare, ett asynkront lambda-uttryck och en asynkron metod. Ett fullständigt exempel som använder dessa element finns i Genomgång: Åtkomst till webben med hjälp av Async och Await. Du kan ladda ned exemplet från .NET Sample Browser. Exempelkoden finns i SerialAsyncExample-projektet .
' 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