Bagikan melalui


Operator Tunggu (Visual Basic)

Anda menerapkan Await operator ke operand dalam metode asinkron atau ekspresi lambda untuk menangguhkan eksekusi metode hingga tugas yang ditunggu selesai. Tugas mewakili pekerjaan yang sedang berlangsung.

Metode di mana Await digunakan harus memiliki pengubah Asinkron . Metode seperti itu, didefinisikan dengan menggunakan pengubah Async , dan biasanya berisi satu atau beberapa Await ekspresi, disebut sebagai metode asinkron.

Nota

Kata kunci Async serta Await diperkenalkan pada Visual Studio 2012. Untuk pengenalan pemrograman asinkron, lihat Pemrograman Asinkron dengan Asinkron dan Tunggu.

Biasanya, tugas yang Anda terapkan Await operator adalah nilai pengembalian dari panggilan ke metode yang mengimplementasikan Pola AsinkronTask-Based, yaitu, Task atau Task<TResult>.

Dalam kode berikut, HttpClient metode GetByteArrayAsync mengembalikan getContentsTask, .Task(Of Byte()) Tugas ini adalah janji untuk menghasilkan array byte aktual ketika operasi selesai. Operator Await diterapkan untuk getContentsTask menangguhkan eksekusi hingga SumPageSizesAsyncgetContentsTask selesai. Sementara itu, kontrol dikembalikan ke pemanggil SumPageSizesAsync. Setelah getContentsTask selesai, Await ekspresi 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 Await ekspresinya adalah TResult. Jika Await diterapkan ke hasil panggilan metode yang mengembalikan Task, Await ekspresi tidak mengembalikan 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 yang dijalankannya. Sebaliknya, itu menyebabkan pengkompilasi mendaftar sisa metode asinkron, setelah Await ekspresi, sebagai kelanjutan pada tugas yang ditunggu. Kontrol kemudian kembali ke pemanggil metode asinkron. Ketika tugas selesai, tugas memanggil kelanjutannya, dan eksekusi metode asinkron dilanjutkan ke tempat yang ditinggalkannya.

Ekspresi Await hanya dapat terjadi dalam isi metode yang segera diapit atau ekspresi lambda yang ditandai oleh pengubah Async . Istilah Menunggu berfungsi sebagai kata kunci hanya dalam konteks tersebut. Di tempat lain, itu ditafsirkan sebagai pengidentifikasi. Async Dalam metode atau ekspresi lambda, Await ekspresi tidak dapat terjadi dalam ekspresi kueri, di Catch blok atau FinallyCoba... Menangkap... Pernyataan terakhir, dalam ekspresi variabel kontrol perulangan dari atau ForFor Each perulangan, atau dalam isi pernyataan SyncLock.

Pengecualian

Sebagian besar metode asinkron mengembalikan atau TaskTask<TResult>. Properti tugas yang dikembalikan membawa informasi tentang status dan riwayatnya, seperti apakah tugas selesai, apakah metode asinkron menyebabkan pengecualian atau dibatalkan, dan apa hasil akhirnya. Operator mengakses properti tersebut Await .

Jika Anda menunggu metode asinkron yang mengembalikan tugas yang menyebabkan pengecualian, Await operator akan memunculkan kembali pengecualian.

Jika Anda menunggu metode asinkron yang mengembalikan tugas yang dibatalkan, Await operator akan menumbuhkan OperationCanceledExceptionkembali .

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. Namun, Anda tidak dapat memprediksi pengecualian mana yang ditumbuhkan kembali.

Untuk contoh penanganan kesalahan dalam metode asinkron, lihat Coba... Menangkap... Pernyataan Terakhir.

Contoh

Contoh Windows Forms berikut mengilustrasikan penggunaan Await dalam metode asinkron, WaitAsynchronouslyAsync. Kontras perilaku metode tersebut dengan perilaku WaitSynchronously. Await Tanpa operator, WaitSynchronously berjalan secara sinkron meskipun penggunaan Async pengubah 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