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 FinallyPernyataan Try…Catch…Finally, dalam ekspresi variabel kontrol perulangan dari atau ForFor 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 Awaitakan 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

Lihat juga