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:
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:
ReadAllTextAsync: Data dibaca secara asinkron
ReadLineAsync: Data dibaca secara asinkronMari kita bedah baris demi baris:
File.WriteAllTextAsyncdanFile.ReadAllTextAsync: versi asinkron dari method sinkronnya; keduanya mengembalikanTaskatauTask<string>yang ditunggu lewatawait.awaitpadaTask: membuat program menunggu hasilnya tanpa memblokir thread pemanggil.await using FileStream aliran:FileStreammengimplementasikanIAsyncDisposable, sehingga pembuangannya pun bisa ditunggu secara asinkron lewatDisposeAsync.using StreamReader pembaca:StreamReadersendiri dibungkususingbiasa; methodReadLineAsyncmengembalikanTask<string?>yang dibaca lewatawait.