練習:以非同步方式使用 SQLite

已完成

應用程式運作正常,但如果資料庫包含許多列,當應用程式執行資料庫查詢和其他作業時,UI 可能會變成無回應。 在此練習中,您會將應用程式從同步的 SQLite API 轉換為非同步版本。 如此一來,無論您對資料庫進行多少查詢,您的應用程式一律都會有回應。

建立非同步連線

  1. 開啟 People 專案中的 PersonRepository.cs 檔案。

  2. Init 方法的定義修改為 async。 將方法的傳回型別變更為 Task

  3. conn 屬性變更為 SQLiteAsyncConnection,並在初始化連線的 Init 方法中更新程式碼。

  4. 使用非同步的 CreateTableAsync 方法,取代發送至同步 CreateTable 方法的呼叫。

    完整的程式碼看起來應該如下:

    private SQLiteAsyncConnection conn;
    
    private async Task Init()
    {
        if (conn != null)
            return;
    
        conn = new SQLiteAsyncConnection(_dbPath);
    
        await conn.CreateTableAsync<Person>();
    }
    

以非同步方式將項目插入資料表

  1. AddNewPerson 方法的定義修改為 async。 將方法的傳回型別變更為 Task

  2. await 關鍵字新增至 Init 方法呼叫,因為 Init 現在是 async 方法。

  3. 更新 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);
       }
    }
    

以非同步方式取得資料表中的所有項目

  1. 移至GetAllPeople 方法定義。 這個方法應該是 async,並傳回 Task<List<Person>> 物件。

  2. await 關鍵字新增至 Init 方法呼叫。

  3. 使用非同步呼叫,更新方法以傳回結果。

    程式碼看起來應該類似:

    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>();
    }
    
  4. 儲存 PersonRepository.cs 檔案。

測試非同步功能

  1. 在 [方案總管] 中,展開 MainPage.xaml,並開啟 MainPage.xaml.cs 檔案。

  2. 修改兩個按鈕點選事件處理常式,以便其使用來自 PersonRepository 類別的非同步方法。 利用 asyncawait 關鍵字:

      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;
      }
    
  3. 儲存 MainPage.xaml.cs 檔案。

  4. 在 Windows 和 Android 上組建並執行應用程式,確認程式仍如往常般運作。