Latihan: Menggunakan SQLite secara asinkron
Aplikasi bekerja dengan baik, tetapi jika database berisi banyak baris, UI dapat menjadi tidak responsif saat aplikasi melakukan kueri database dan operasi lainnya. Dalam latihan ini, Anda mengonversi aplikasi dari SQLite API sinkron ke versi asinkron. Dengan cara ini, aplikasi Anda selalu responsif tidak peduli berapa banyak kueri yang Anda buat ke database Anda.
Membuat koneksi Asinkron
Buka file PersonRepository.cs di proyek People .
InitUbah definisi metode menjadiasync. Mengubah tipe pengembalian metode menjadiTask.connUbah properti menjadiSQLiteAsyncConnectiondan perbarui kode dalamInitmetode yang menginisialisasi koneksi.Ganti panggilan ke metode sinkron
CreateTabledengan metode asinkronCreateTableAsync.Kode yang sudah selesai akan terlihat seperti ini
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
Menyisipkan item ke dalam tabel secara asinkron
Ubah definisi metode menjadi
AddNewPersonasync. Mengubah tipe pengembalian metode menjadiTask.awaitTambahkan kata kunci keInitpanggilan metode karenaInitsekarangasyncmerupakan metode.AddNewPersonPerbarui metode untuk menyisipkan yang baruPersondengan menggunakan operasi penyisipan asinkron.Kode akan terlihat seperti ini:
using System.Threading.Tasks; ... public async Task AddNewPerson(string name) { int result = 0; try { // Call Init() await Init(); // basic validation to ensure a name was entered if (string.IsNullOrEmpty(name)) throw new Exception("Valid name required"); result = await conn.InsertAsync(new Person { Name = name }); StatusMessage = string.Format("{0} record(s) added [Name: {1})", result, name); } catch (Exception ex) { StatusMessage = string.Format("Failed to add {0}. Error: {1}", name, ex.Message); } }
Dapatkan semua item dari tabel secara asinkron
GetAllPeopleUbah definisi metode. Metode ini harus menjadiasyncdan mengembalikan objekTask<List<Person>>.awaitTambahkan kata kunci keInitpanggilan metode.Perbarui metode untuk mengembalikan hasil dengan menggunakan panggilan asinkron.
Kode akan terlihat seperti ini:
public async Task<List<Person>> GetAllPeople() { try { await Init(); return await conn.Table<Person>().ToListAsync(); } catch (Exception ex) { StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message); } return new List<Person>(); }Simpan file PersonRepository.cs.
Menguji fungsionalitas asinkron
Perluas MainPage.xaml di Penjelajah Solusi dan buka file MainPage.xaml.cs .
Ubah kedua penanganan aktivitas klik tombol sehingga mereka menggunakan metode asinkron dari
PersonRepositorykelas . Manfaatkan kata kunciasyncdanawait:public async void OnNewButtonClicked(object sender, EventArgs args) { statusMessage.Text = ""; await App.PersonRepo.AddNewPerson(newPerson.Text); statusMessage.Text = App.PersonRepo.StatusMessage; } public async void OnGetButtonClicked(object sender, EventArgs args) { statusMessage.Text = ""; List<Person> people = await App.PersonRepo.GetAllPeople(); peopleList.ItemsSource = people; }Simpan MainPage.xaml.cs file.
Buat dan jalankan program di Windows dan Android, verifikasi bahwa program masih berfungsi seperti sebelumnya.