Asinkron (Visual Basic)

Pengubah Async menunjukkan bahwa metode atau ekspresi lambda yang dimodifikasinya asinkron. Metode tersebut disebut sebagai metode asinkron.

Metode asinkron menyediakan cara mudah untuk melakukan pekerjaan yang berpotensi berjalan lama tanpa memblokir utas pemanggil. Pemanggil metode asinkron dapat melanjutkan pekerjaannya tanpa menunggu metode asinkron selesai.

Catatan

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

Contoh berikut menunjukkan struktur metode asinkron. Menurut konvensi, nama metode asinkron berakhiran "Async."

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

Biasanya, metode yang dimodifikasi oleh kata kunci Async berisi setidaknya satu ekspresi atau pernyataan Tunggu. Metode berjalan secara sinkron sampai mencapai Await pertama, di mana ia menangguhkan sampai tugas yang ditunggu selesai. Sementara itu, kontrol dikembalikan ke pemanggil metode. Jika metode tidak berisi ekspresi atau pernyataan Await, metode tidak ditangguhkan dan dijalankan seperti metode sinkron. Peringatan kompiler menunjukkan Anda segera ke metode asinkron apa pun yang tidak berisi Await karena situasi tersebut mungkin menunjukkan kesalahan. Untuk informasi selengkapnya, lihat kesalahan kompiler.

Kata kunci Async adalah kata kunci yang tidak dicadangkan. Ini adalah kata kunci ketika memodifikasi metode atau ekspresi lambda. Dalam semua konteks lainnya, ini ditafsirkan sebagai pengidentifikasi.

Jenis Kembalian

Metode asinkron adalah Sub prosedur, atau prosedur Fungsi yang memiliki jenis pengembalian Task atau Task<TResult>. Metode ini tidak dapat menyatakan parameter ByRef apa pun.

Anda menentukan Task(Of TResult) untuk jenis pengembalian metode asinkron jika pernyataan Return metode memiliki operan TResult jenis. Anda menggunakan Task jika tidak ada nilai yang bermakna dikembalikan ketika metode selesai. Artinya, panggilan ke metode mengembalikan Task, tetapi ketika Task selesai, pernyataan Await apa pun yang menunggu Task tidak menghasilkan nilai hasil.

Subroutine asinkron digunakan terutama untuk menentukan penanganan aktivitas yang mengharuskan prosedur Sub. Pemanggil subroutine asinkron tidak dapat menunggunya dan tidak dapat menangkap pengecualian yang dilemparkan metode.

Untuk informasi dan contoh selengkapnya, lihat Jenis Pengembalian Asinkron.

Contoh

Contoh berikut menunjukkan penanganan aktivitas asinkron, ekspresi lambda asinkron, dan metode asinkron. Untuk contoh lengkap yang menggunakan elemen-elemen ini, lihat Panduan: Mengakses Web dengan Menggunakan Asinkron dan Menunggu. Anda dapat mengunduh sampel dari Browser Sampel .NET. Contoh kode ada dalam proyek SerialAsyncExample.

' 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

Lihat juga