Ö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
conn
till enSQLiteAsyncConnection
och uppdatera koden i metodenInit
som initierar anslutningen.Ersätt anropet till den synkrona
CreateTable
metoden med den asynkronaCreateTableAsync
metoden.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
AddNewPerson
metoden tillasync
. Ändra returtypen för metoden tillTask
.Lägg till nyckelordet
await
i metodanropetInit
eftersomInit
det nu är enasync
metod.AddNewPerson
Uppdatera metoden för att infoga en nyPerson
med 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 varaasync
och returnera ettTask<List<Person>>
objekt.Lägg till nyckelordet
await
i 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
PersonRepository
klassen. Använd nyckelordenasync
ochawait
: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.