Async (Visual Basic)

A Async módosító azt jelzi, hogy a módosító metódus vagy lambda kifejezés aszinkron. Ezeket a metódusokat aszinkron metódusnak nevezzük.

Az aszinkron metódus kényelmes módot kínál a hosszú ideig futó műveletek elvégzésére anélkül, hogy blokkolnák a hívó szálát. Az aszinkron metódus hívója anélkül folytathatja a munkáját, hogy megvárja az aszinkron metódus befejezését.

Feljegyzés

A Async visual Studio 2012-ben bevezettük a kulcsszavakat és Await a kulcsszavakat. Az aszinkron programozás bemutatása: Aszinkron programozás az Async és a Await használatával.

Az alábbi példa egy aszinkron metódus szerkezetét mutatja be. Konvenció szerint az aszinkron metódusnevek "Async"-ben végződnek.

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

A kulcsszó által Async módosított metódusok általában legalább egy Await kifejezést vagy utasítást tartalmaznak. A metódus szinkron módon fut, amíg el nem éri az elsőt Await, és addig felfüggeszti, amíg a várt tevékenység be nem fejeződik. Addig is a rendszer visszaadja a vezérlőt a metódus hívójának. Ha a metódus nem tartalmaz kifejezést vagy utasítást Await , a rendszer nem függeszti fel a metódust, és szinkron metódusként hajtja végre. A fordító figyelmeztetése figyelmeztet minden olyan aszinkron metódusra, amely nem tartalmaz Await , mert ez a helyzet hibát jelezhet. További információkért tekintse meg a fordító hibáját.

A Async kulcsszó egy nem felügyelt kulcsszó. Ez egy kulcsszó, ha módosít egy metódust vagy egy lambda kifejezést. A rendszer minden más környezetben azonosítóként értelmezi.

Visszatérési típusok

Az aszinkron metódus vagy alművelet, vagy függvényeljárás, amelynek visszatérési Task típusa vagy Task<TResult>. A metódus nem deklarálhat ByRef-paramétereket.

Az aszinkron metódus visszatérési típusát akkor adja meg Task(Of TResult) , ha a metódus Visszatérési utasítása TResult típusú operandussal rendelkezik. Akkor használja Task , ha a metódus befejezésekor nem ad vissza értelmes értéket. Ez azt jelenti, hogy a metódus hívása visszaad egy Task, de ha a Task művelet befejeződött, az arra váró Task összes Await utasítás nem eredményez eredményértéket.

Az aszinkron alrutinok elsősorban olyan eseménykezelők definiálására szolgálnak, ahol Sub eljárásra van szükség. Az aszinkron alrutin hívója nem tudja megvárni, és nem tudja elkapni a metódus által elvetett kivételeket.

További információkért és példákért tekintse meg az Async Return Types (Aszinkron visszatérési típusok) című témakört.

Példa

Az alábbi példák egy aszinkron eseménykezelőt, egy aszinkron lambda kifejezést és egy aszinkron metódust mutatnak be. Az alábbi elemeket használó teljes példáért tekintse meg az útmutatót: A web elérése az Async és a Await használatával. A mintát a .NET mintaböngészőből töltheti le. A példakód a SerialAsyncExample projektben található.

' 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

Lásd még