Bagikan melalui


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.

Nota

Kata kunci Async serta 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 "Asinkron."

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 Async kata kunci berisi setidaknya satu ekspresi atau pernyataan Tunggu . Metode ini berjalan secara sinkron sampai mencapai yang pertama Await, di mana ia menangguhkan hingga tugas yang ditunggu selesai. Sementara itu, kontrol dikembalikan ke pemanggil metode. Jika metode tidak berisi Await ekspresi atau pernyataan, metode tidak ditangguhkan dan dijalankan sebagai metode sinkron. Peringatan kompilator memperingatkan Anda ke metode asinkron apa pun yang tidak berisi Await karena situasi tersebut mungkin menunjukkan kesalahan. Untuk informasi selengkapnya, lihat kesalahan pengkompilasi.

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

Jenis Kembalian

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

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

Subroutine asinkron digunakan terutama untuk menentukan penanganan aktivitas di mana Sub prosedur diperlukan. 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