operator tunggu - secara asinkron menunggu tugas selesai

Operator await menangguhkan evaluasi metode asinkron penutup hingga operasi asinkron yang diwakili oleh operand selesai. Ketika operasi asinkron selesai, operator await mengembalikan hasil operasi, jika ada. Ketika operator await diterapkan ke operand yang mewakili operasi yang sudah selesai, operator akan segera mengembalikan hasil operasi tanpa penangguhan metode penutup. Operator await tidak memblokir utas yang mengevaluasi metode asinkron. Ketika operator await menangguhkan metode asinkron penutup, kontrol kembali ke pemanggil metode.

Dalam contoh berikut, metode HttpClient.GetByteArrayAsync mengembalikan instans Task<byte[]>, yang mewakili operasi asinkron yang menghasilkan array byte saat operasi tersebut selesai. Sampai operasi selesai, operator await menangguhkan metode DownloadDocsMainPageAsync. Ketika DownloadDocsMainPageAsync ditangguhkan, kontrol dikembalikan ke metode Main, yang merupakan pemanggil DownloadDocsMainPageAsync. Metode Main ini dijalankan sampai membutuhkan hasil operasi asinkron yang dilakukan oleh metode DownloadDocsMainPageAsync. Ketika GetByteArrayAsync mendapatkan semua byte, sisa metode DownloadDocsMainPageAsync dievaluasi. Setelah itu, sisa metode Main akan dievaluasi.

public class AwaitOperator
{
    public static async Task Main()
    {
        Task<int> downloading = DownloadDocsMainPageAsync();
        Console.WriteLine($"{nameof(Main)}: Launched downloading.");

        int bytesLoaded = await downloading;
        Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes.");
    }

    private static async Task<int> DownloadDocsMainPageAsync()
    {
        Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading.");

        var client = new HttpClient();
        byte[] content = await client.GetByteArrayAsync("https://learn.microsoft.com/en-us/");

        Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
        return content.Length;
    }
}
// Output similar to:
// DownloadDocsMainPageAsync: About to start downloading.
// Main: Launched downloading.
// DownloadDocsMainPageAsync: Finished downloading.
// Main: Downloaded 27700 bytes.

Operand await ekspresi harus menyediakan pemberitahuan saat tugas selesai. Secara umum, delegasi dipanggil ketika tugas selesai, baik berhasil atau tidak berhasil. Bagian await spesifikasi bahasa C# memberikan detail tentang bagaimana pemberitahuan ini diterapkan.

Contoh sebelumnya menggunakan metode asinkronMain. Untuk informasi selengkapnya, lihat bagian operator await di Metode utama.

Catatan

Untuk pengenalan pemrograman asinkron, lihat Pemrograman Asinkron dengan async dan await. Pemrograman asinkron dengan async dan await yang mengikuti pola asinkron berbasis tugas.

Anda hanya dapat menggunakan operator await dalam metode, ekspresi lambda, atau metode anonim yang dimodifikasi oleh kata kunci async. Dalam metode asinkron, Anda tidak dapat menggunakan operator await dalam isi fungsi sinkron, di dalam blok pernyataan kunci, dan dalam konteks yang tidak aman.

Operand operator await biasanya dari salah satu jenis .NET berikut: Task, Task<TResult>, ValueTask, atau ValueTask<TResult>. Namun, ekspresi penangguhan apa pun dapat menjadi operand operator await. Untuk informasi selengkapnya, lihat bagian Ekspresi Penangguhan dari spesifikasi bahasa pemrogram C#.

Jenis dari ekspresi await t adalah TResult jika jenis dari ekspresi t merupakan Task<TResult> atau ValueTask<TResult>. Jika jenis t adalah Task atau ValueTask, jenis dari await t adalah void. Dalam kedua kasus tersebut, jika t melemparkan pengecualian, await t melemparkan kembali pengecualian.

Aliran asinkron dan sekali pakai

Anda menggunakan pernyataan await foreach untuk memakai aliran data asinkron. Untuk informasi selengkapnya, lihat foreach bagian pernyataan dari artikel Pernyataan perulangan.

Anda menggunakan pernyataan await using untuk bekerja dengan objek sekali pakai secara asinkron, yaitu objek jenis yang menerapkan antarmuka IAsyncDisposable. Untuk informasi selengkapnya, lihat bagian Menggunakan async disposable dari artikel Menerapkan metode DisposeAsync.

operator await dalam metode Utama

Metode Main, yang merupakan titik masuk aplikasi, dapat mengembalikan Task atau Task<int>, memungkinkannya menjadi asinkron sehingga Anda dapat menggunakan await operator dalam isinya. Dalam versi C# sebelumnya, untuk memastikan bahwa metode Main menangguhkan penyelesaian operasi asinkron, Anda dapat mengambil nilai properti Task<TResult>.Result dari instans Task<TResult> yang dikembalikan oleh metode asinkron yang sesuai. Untuk operasi asinkron yang tidak menghasilkan nilai, Anda dapat memanggil metode Task.Wait. Untuk informasi tentang cara memilih versi bahasa, lihat penerapan versi bahasa pemrogram C#.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian Ekspresi Await dari spesifikasi bahasa pemrogram C#.

Lihat juga