練習:以非同步方式使用 SQLite
應用程式運作正常,但如果資料庫包含許多列,當應用程式執行資料庫查詢和其他作業時,UI 可能會變成無回應。 在此練習中,您會將應用程式從同步的 SQLite API 轉換為非同步版本。 如此一來,無論您對資料庫進行多少查詢,您的應用程式一律都會有回應。
建立非同步連線
開啟 People 專案中的 PersonRepository.cs 檔案。
將
Init
方法的定義修改為async
。 將方法的傳回型別變更為Task
。將
conn
屬性變更為SQLiteAsyncConnection
,並在初始化連線的Init
方法中更新程式碼。使用非同步的
CreateTableAsync
方法,取代發送至同步CreateTable
方法的呼叫。完整的程式碼看起來應該如下:
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 上組建並執行應用程式,確認程式仍如往常般運作。