Operator Tunggu (Visual Basic)
Anda menerapkan operator Await
ke operand dalam metode asinkron atau ekspresi lambda untuk menangguhkan eksekusi metode hingga tugas yang ditunggu selesai. Tugas mewakili pekerjaan yang sedang berlangsung.
Metode Await
digunakan harus memiliki pengubah Asinkron. Metode seperti itu, didefinisikan dengan menggunakan pengubah Async
, dan biasanya berisi satu atau beberapa ekspresi Await
, disebut sebagai metode asinkron.
Catatan
Kata kunci Async
dan Await
diperkenalkan pada Visual Studio 2012. Untuk pengenalan pemrograman asinkron, lihat Pemrograman Asinkron dengan Asinkron dan Tunggu.
Biasanya, tugas yang Anda terapkan operator Await
adalah nilai pengembalian dari panggilan ke metode yang mengimplementasikan Pola Asinkron Berbasis Tugas, yaitu Task atau Task<TResult>.
Dalam kode berikut, HttpClient metode GetByteArrayAsync mengembalikan getContentsTask
, sebuah Task(Of Byte())
. Tugas ini adalah janji untuk menghasilkan array byte aktual ketika operasi selesai. Operator Await
diterapkan ke getContentsTask
menangguhkan eksekusi SumPageSizesAsync
hingga getContentsTask
selesai. Sementara itu, kontrol dikembalikan ke pemanggil SumPageSizesAsync
. Setelah getContentsTask
selesai, ekspresi Await
mengevaluasi ke array byte.
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
Penting
Untuk contoh lengkapnya, lihat Panduan: Mengakses Web dengan Menggunakan Asinkron dan Tunggu. Anda dapat mengunduh sampel dari Browser Sampel .NET. Contoh kode ada dalam proyek SerialAsyncExample.
Jika Await
diterapkan ke hasil panggilan metode yang mengembalikan Task(Of TResult)
, jenis ekspresi Await
adalah TResult. Jika Await
diterapkan ke hasil panggilan metode yang mengembalikan Task
, ekspresi Await
tidak mengembalikan sebuah nilai. Contoh berikut mengilustrasikan perbedaannya.
' 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()
Ekspresi Await
atau pernyataan tidak memblokir utas di mana dijalankan. Sebaliknya, ini menyebabkan kompilator mendaftarkan sisa metode asinkron, setelah ekspresi Await
, sebagai kelanjutan pada tugas yang ditunggu. Kontrol kemudian kembali ke pemanggil metode asinkron. Ketika tugas selesai, tugas memanggil kelanjutannya, dan eksekusi metode asinkron dilanjutkan di tempat yang ditinggalkannya.
Ekspresi Await
hanya dapat terjadi di isi metode penutup segera atau ekspresi lambda yang ditandai oleh pengubah Async
. Istilah Tunggu berfungsi sebagai kata kunci hanya dalam konteks tersebut. Di tempat lain, itu ditafsirkan sebagai pengidentifikasi. Dalam metode Async
atau ekspresi lambda, ekspresi Await
tidak dapat terjadi dalam ekspresi kueri, dalam blok Catch
atau Finally
Pernyataan Try…Catch…Finally, dalam ekspresi variabel kontrol perulangan dari atau For
For Each
perulangan, atau di isi pernyataan SyncLock.
Pengecualian
Sebagian besar metode asinkron mengembalikan Task atau Task<TResult>. Properti tugas yang dikembalikan membawa informasi tentang status dan riwayatnya, seperti apakah tugas telah selesai, apakah metode asinkron menyebabkan pengecualian atau dibatalkan, dan apa hasil akhirnya. Operator Await
mengakses properti tersebut.
Jika Anda menunggu metode asinkron yang dikembalikan tugas yang menyebabkan pengecualian, operator Await
akan menggagalkan kembali pengecualian.
Jika Anda menunggu metode asinkron yang dikembalikan tugas yang dibatalkan, operator Await
akan memunculkan kembali OperationCanceledException.
Satu tugas yang dalam keadaan rusak dapat mencerminkan beberapa pengecualian. Misalnya, tugas mungkin merupakan hasil dari panggilan ke Task.WhenAll. Ketika Anda menunggu tugas seperti itu, operasi tunggu hanya memunculkan kembali salah satu pengecualian. Tetapi, Anda tidak dapat memprediksi pengecualian mana yang dimunculkan kembali.
Untuk contoh penanganan kesalahan dalam metode asinkron, lihat Pernyataan Try...Catch...Finally.
Contoh
Contoh Formulir Windows berikut mengilustrasikan penggunaan Await
dalam metode asinkron, WaitAsynchronouslyAsync
. Kontras perilaku metode tersebut dengan perilaku WaitSynchronously
. Tanpa operator Await
, WaitSynchronously
berjalan secara sinkron meskipun menggunakan pengubah Async
dalam definisinya dan panggilan ke Thread.Sleep dalam isinya.
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