Oefening: SQLite asynchroon gebruiken
De toepassing werkt goed, maar als de database veel rijen bevat, kan de gebruikersinterface niet meer reageren terwijl de app databasequery's en andere bewerkingen uitvoert. In deze oefening converteert u de toepassing van de synchrone SQLite-API naar de asynchrone versie. Op deze manier reageert uw toepassing altijd, ongeacht het aantal query's dat u in uw database maakt.
Een Asynchrone verbinding maken
Open het PersonRepository.cs-bestand in het project Personen .
Wijzig de definitie van de
Init
methode in .async
Wijzig het retourtype van de methode inTask
.Wijzig de
conn
eigenschap in eenSQLiteAsyncConnection
en werk de code bij in deInit
methode waarmee de verbinding wordt geïnitialiseerd.Vervang de aanroep naar de synchrone
CreateTable
methode door de asynchroneCreateTableAsync
methode.De voltooide code moet er als volgt uitzien:
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
Een item asynchroon invoegen in een tabel
Wijzig de definitie van de
AddNewPerson
methode die moet wordenasync
gebruikt. Wijzig het retourtype van de methode inTask
.Voeg het
await
trefwoord toe aan deInit
methodeaanroep omdat ditInit
nu eenasync
methode is.Werk de
AddNewPerson
methode bij om een nieuwePerson
in te voegen met behulp van een asynchrone invoegbewerking.De code moet er als volgt uitzien:
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); } }
Alle items asynchroon uit een tabel ophalen
Wijzig de
GetAllPeople
methodedefinitie. Deze methode moet een object zijnasync
en retournerenTask<List<Person>>
.Voeg het
await
trefwoord toe aan deInit
methode-aanroep.Werk de methode bij om de resultaten te retourneren met behulp van een asynchrone aanroep.
De code moet er als volgt uitzien:
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>(); }
Sla het PersonRepository.cs bestand op.
De asynchrone functionaliteit testen
Vouw MainPage.xaml uit in Solution Explorer en open het bestand MainPage.xaml.cs .
Wijzig beide gebeurtenis-handlers met de knopklik zodat ze de asynchrone methoden uit de
PersonRepository
klasse gebruiken. Maak gebruik van deasync
trefwoorden enawait
trefwoorden: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; }
Sla het MainPage.xaml.cs bestand op.
Bouw en voer het programma uit op Windows en Android en controleer of het nog steeds werkt zoals voorheen.