แบบฝึกหัด: ใช้ SQLite แบบอะซิงโครนัส
แอปพลิเคชันทํางานได้ดี แต่ถ้าฐานข้อมูลมีหลายแถว UI สามารถไม่ตอบสนองได้ในขณะที่แอปดําเนินการคิวรีฐานข้อมูลและการดําเนินการอื่น ๆ ในแบบฝึกหัดนี้ คุณแปลงแอปพลิเคชันจาก SQLite API แบบซิงโครนัสเป็นเวอร์ชันอะซิงโครนัส ด้วยวิธีนี้ แอปพลิเคชันของคุณตอบสนองเสมอ ไม่ว่าคุณจะสร้างคิวรีไปยังฐานข้อมูลของคุณมากน้อยเพียงใด
สร้างการเชื่อมต่อ Async
เปิดไฟล์ PersonRepository.cs ในโครงการ บุคคล
แก้ไขข้อกําหนดของวิธีการ
Initเพื่อให้asyncเปลี่ยนชนิดผลลัพธ์ของวิธีการ เป็นTaskเปลี่ยนคุณสมบัติ
connเป็นSQLiteAsyncConnectionและอัปเดตโค้ดในวิธีการInitที่เริ่มต้นการเชื่อมต่อแทนที่การเรียกไปยังเมธอด
CreateTableแบบซิงโครนัส ด้วยเมธอดCreateTableAsyncแบบอะซิงโครนัสโค้ดที่เสร็จสมบูรณ์ควรมีลักษณะดังนี้:
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
แทรกรายการลงในตารางแบบอะซิงโครนัส
ปรับเปลี่ยนข้อกําหนดของวิธีการ
AddNewPersonที่จะasyncเปลี่ยนชนิดผลลัพธ์ของวิธีการ เป็นTaskเพิ่มคําหลัก
awaitลงในการเรียกใช้เมธอดInitเนื่องจากInitขณะนี้เป็นวิธีการasyncอัปเดตวิธีการ
AddNewPersonเพื่อแทรกPersonใหม่โดยใช้การดําเนินการแทรกแบบอะซิงโครนัสโค้ดควรมีลักษณะดังนี้:
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); } }
รับรายการทั้งหมดจากตารางแบบอะซิงโครนัส
แก้ไขข้อกําหนดวิธีการ
GetAllPeopleวิธีนี้ควรasyncและส่งกลับวัตถุTask<List<Person>>เพิ่มคําสําคัญ
awaitไปยังการเรียกวิธีการInitอัปเดตวิธีการ เพื่อแสดงผลลัพธ์โดยใช้การเรียกใช้แบบอะซิงโครนัส
โค้ดควรมีลักษณะดังนี้:
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>(); }บันทึกไฟล์ PersonRepository.cs
ทดสอบฟังก์ชันการทํางานแบบอะซิงโครนัส
ขยาย MainPage.xaml ในตัวสํารวจโซลูชัน และเปิดไฟล์ MainPage.xaml.cs
ปรับเปลี่ยนตัวจัดการเหตุการณ์การคลิกปุ่มทั้งสองเพื่อให้ใช้วิธีแบบอะซิงโครนัสจากคลาส
PersonRepositoryใช้คําสําคัญasyncและawait: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; }บันทึกไฟล์ MainPage.xaml.cs
สร้างและเรียกใช้โปรแกรมบน Windows และ Android เพื่อตรวจสอบว่ายังคงทํางานเหมือนก่อนหน้านี้หรือไม่