Seluruh contoh di bab-bab sebelumnya bersifat sinkron: thread yang menjalankan kode berhenti total sampai sistem operasi selesai membaca atau menulis. Untuk aplikasi server dan GUI, berhenti berarti lambat merespons. Operasi berkas asinkron memindahkan pekerjaan itu ke sistem operasi, lalu kode kita dilanjutkan begitu hasilnya siap.

await dalam Satu Bagian Singkat #

Method yang memuat await ditandai kata kunci async. Ketika program mencapai await, sisa method dicatat terlebih dahulu, lalu kontrol dikembalikan ke pemanggil; thread tidak menunggu dengan sibuk. Setelah operasi I/O selesai, sisa method dieksekusi menggunakan hasilnya. Section Asynchronous Programming membahas mekanisme ini lebih dalam; untuk bab ini, pola async Task beserta pasangan method *Async sudah cukup agar contohnya terbaca.

Pasangan asinkronnya hampir satu-satu dengan versi sinkron: WriteAllText berpasangan dengan WriteAllTextAsync, ReadAllText dengan ReadAllTextAsync, dan ReadLine dengan ReadLineAsync. Contoh di bab ini ditulis sebagai top-level statement, sehingga await boleh dipakai langsung tanpa membuat method Main sendiri; di dalam method biasa, tanda tangan method berubah menjadi async Task.

Contoh Baca-tulis Asinkron #

Contoh berikut menulis dan membaca berkas dengan pasangan method asinkron, lalu membaca satu baris lewat StreamReader:

csharp
string dir = Path.Combine(Path.GetTempPath(), "verify-6c", "asynchronous-file-io");
Directory.CreateDirectory(dir);
string path = Path.Combine(dir, "async.txt");
await File.WriteAllTextAsync(path, "Data dibaca secara asinkron");

string isi = await File.ReadAllTextAsync(path);
Console.WriteLine($"ReadAllTextAsync: {isi}");

await using FileStream aliran =
    new FileStream(path, FileMode.Open, FileAccess.Read);
using StreamReader pembaca = new StreamReader(aliran);
string? baris = await pembaca.ReadLineAsync();
Console.WriteLine($"ReadLineAsync: {baris}");

Output yang Dihasilkan:

text
ReadAllTextAsync: Data dibaca secara asinkron
ReadLineAsync: Data dibaca secara asinkron

Mari kita bedah baris demi baris:

  1. File.WriteAllTextAsync dan File.ReadAllTextAsync: versi asinkron dari method sinkronnya; keduanya mengembalikan Task atau Task<string> yang ditunggu lewat await.
  2. await pada Task: membuat program menunggu hasilnya tanpa memblokir thread pemanggil.
  3. await using FileStream aliran: FileStream mengimplementasikan IAsyncDisposable, sehingga pembuangannya pun bisa ditunggu secara asinkron lewat DisposeAsync.
  4. using StreamReader pembaca: StreamReader sendiri dibungkus using biasa; method ReadLineAsync mengembalikan Task<string?> yang dibaca lewat await.