Övning: Använda SQLite asynkront
Programmet fungerar bra, men om databasen innehåller många rader kan användargränssnittet inte svara medan appen utför databasfrågor och andra åtgärder. I den här övningen konverterar du programmet från det synkrona SQLite-API:et till den asynkrona versionen. På så sätt är ditt program alltid responsivt oavsett hur många frågor du gör i databasen.
Skapa en Async-anslutning
Öppna filen PersonRepository.cs i people-projektet.
InitÄndra metodens definition tillasync. Ändra returtypen för metoden tillTask.Ändra egenskapen
conntill enSQLiteAsyncConnectionoch uppdatera koden i metodenInitsom initierar anslutningen.Ersätt anropet till den synkrona
CreateTablemetoden med den asynkronaCreateTableAsyncmetoden.Den färdiga koden bör se ut så här:
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
Infoga ett objekt i en tabell asynkront
Ändra definitionen av
AddNewPersonmetoden tillasync. Ändra returtypen för metoden tillTask.Lägg till nyckelordet
awaiti metodanropetIniteftersomInitdet nu är enasyncmetod.AddNewPersonUppdatera metoden för att infoga en nyPersonmed hjälp av en asynkron infogningsåtgärd.Koden bör se ut så här:
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); } }
Hämta alla objekt från en tabell asynkront
Ändra metoddefinitionen
GetAllPeople. Den här metoden ska varaasyncoch returnera ettTask<List<Person>>objekt.Lägg till nyckelordet
awaiti metodanropetInit.Uppdatera metoden för att returnera resultatet med hjälp av ett asynkront anrop.
Koden bör se ut så här:
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>(); }Spara filen PersonRepository.cs .
Testa asynkrona funktioner
Expandera MainPage.xaml i Solution Explorer och öppna filen MainPage.xaml.cs .
Ändra båda händelsehanterarna med knappklick så att de använder asynkrona metoder från
PersonRepositoryklassen. Använd nyckelordenasyncochawait: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; }Spara filen MainPage.xaml.cs .
Skapa och kör programmet på Windows och Android och kontrollera att det fortfarande fungerar som tidigare.