Várakozás operátor (Visual Basic)
Az operátort Await
egy aszinkron metódusban vagy lambdakifejezésben egy operandusra alkalmazza, hogy a várt feladat befejezéséig felfüggesztse a metódus végrehajtását. A tevékenység a folyamatban lévő munkát jelöli.
A használt metódusnak Await
Async-módosítóval kell rendelkeznie. Az ilyen, a Async
módosítóval definiált, általában egy vagy több Await
kifejezést tartalmazó metódust aszinkron metódusnak nevezzük.
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 operátort alkalmazó Await
tevékenység általában a feladatalapú aszinkron mintát implementáló metódusra irányuló hívás visszatérési értéke, azaz egy Task vagy egyTask<TResult>.
A következő kódban a HttpClient metódus GetByteArrayAsync a getContentsTask
.Task(Of Byte())
A feladat ígéret arra, hogy a művelet befejezésekor a tényleges bájttömböt hozza létre. Az Await
operátort arra alkalmazza a rendszer, hogy getContentsTask
felfüggesztse a SumPageSizesAsync
végrehajtást, amíg be nem getContentsTask
fejeződik. Addig is a rendszer visszaadja a vezérlőt a hívónak SumPageSizesAsync
. Ha getContentsTask
elkészült, a Await
kifejezés egy bájttömbre lesz kiértékelve.
Private Async Function SumPageSizesAsync() As Task
' To use the HttpClient type in desktop apps, you must include a using directive and add a
' reference for the System.Net.Http namespace.
Dim client As HttpClient = New HttpClient()
' . . .
Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
Dim urlContents As Byte() = Await getContentsTask
' Equivalently, now that you see how it works, you can write the same thing in a single line.
'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
' . . .
End Function
Fontos
A teljes példaé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ó.
Ha Await
egy metódushívás eredményére van alkalmazva, akkor Task(Of TResult)
a kifejezés típusa Await
TResult. Ha Await
egy metódushívás eredményére van alkalmazva, akkor Task
a Await
kifejezés nem ad vissza értéket. Az alábbi példa a különbséget szemlélteti.
' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()
' Await used with a method that returns a Task.
Await AsyncMethodThatReturnsTask()
Egy Await
kifejezés vagy utasítás nem blokkolja azt a szálat, amelyen végrehajtja. Ehelyett a fordító a kifejezés után Await
regisztrálja az aszinkron metódus többi részét a várt feladat folytatásaként. A control ezután visszatér az aszinkron metódus hívójának. Amikor a feladat befejeződött, meghívja annak folytatását, és az aszinkron metódus végrehajtása ott folytatódik, ahol abbahagyta.
Egy Await
kifejezés csak egy azonnal befoglaló metódus vagy lambda kifejezés törzsében fordulhat elő, amelyet módosító Async
jelöl. A Await kifejezés csak ebben a kontextusban szolgál kulcsszóként. Máshol a rendszer azonosítóként értelmezi. A metódusban vagy a Async
lambda kifejezésben Await
nem fordulhat elő kifejezés egy lekérdezési kifejezésben, a Próba vagy Finally
a Catch
Blokkban... Fogás... Végül egy vagyFor Each
több ciklus ciklusvezérlési változójának For
kifejezésében, vagy egy SyncLock utasítás törzsében.
Kivételek
A legtöbb aszinkron metódus egy Task vagy Task<TResult>. A visszaadott tevékenység tulajdonságai információkat tartalmaznak az állapotáról és előzményeiről, például arról, hogy a tevékenység befejeződött-e, hogy az aszinkron metódus kivételt okozott vagy megszakított, és hogy mi a végeredmény. Az Await
operátor hozzáfér ezekhez a tulajdonságokhoz.
Ha egy kivételt okozó feladatátvételi aszinkron metódusra vár, az Await
operátor újra megszűrésbe teszi a kivételt.
Ha egy megszakított feladat-visszatérési aszinkron metódusra vár, az Await
operátor újra megszúr egy OperationCanceledException.
Egy hibás állapotú tevékenység több kivételt is tükrözhet. Előfordulhat például, hogy a feladat egy hívás Task.WhenAlleredménye. Amikor egy ilyen feladatot vár, a várakozási művelet csak az egyik kivételt iktatja újra. Azt azonban nem tudja előrejelezni, hogy a kivételek közül melyik kerül újra a rendszerbe.
Példák az aszinkron metódusok hibakezelésére: Kipróbálás... Fogás... Végül nyilatkozat.
Példa
Az alábbi Windows Forms-példa egy aszinkron metódus használatát szemléltetiAwait
. WaitAsynchronouslyAsync
A metódus viselkedésének ellentéte a következő viselkedésével WaitSynchronously
: . Await
Operátor nélkül, szinkron módon fut annak ellenére, WaitSynchronously
hogy a Async
módosító a definíciójában és a szervezetében lévő Thread.Sleep hívás.
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' Call the method that runs asynchronously.
Dim result As String = Await WaitAsynchronouslyAsync()
' Call the method that runs synchronously.
'Dim result As String = Await WaitSynchronously()
' Display the result.
TextBox1.Text &= result
End Sub
' The following method runs asynchronously. The UI thread is not
' blocked during the delay. You can move or resize the Form1 window
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
Await Task.Delay(10000)
Return "Finished"
End Function
' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
' Import System.Threading for the Sleep method.
Thread.Sleep(10000)
Return "Finished"
End Function