Ćwiczenie: asynchronicznie użyj sqlite
Aplikacja działa dobrze, ale jeśli baza danych zawiera wiele wierszy, interfejs użytkownika może nie odpowiadać, gdy aplikacja wykonuje zapytania bazy danych i inne operacje. W tym ćwiczeniu przekonwertujesz aplikację z synchronicznego interfejsu API SQLite na wersję asynchroniczną. Dzięki temu aplikacja zawsze reaguje bez względu na liczbę zapytań, które wykonujesz w bazie danych.
Tworzenie połączenia asynchronicznego
Otwórz plik PersonRepository.cs w projekcie People .
Zmodyfikuj definicję
Initmetody naasync. Zmień zwracany typ metody naTask.Zmień właściwość na
connwartość iSQLiteAsyncConnectionzaktualizuj kod wInitmetodzie , która inicjuje połączenie.Zastąp wywołanie metody synchronicznej metodą asynchroniczną
CreateTableCreateTableAsync.Gotowy kod powinien wyglądać następująco:
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
Wstawianie elementu do tabeli asynchronicznie
Zmodyfikuj definicję metody
AddNewPersonnaasync. Zmień zwracany typ metody naTask.awaitDodaj słowo kluczowe do wywołaniaInitmetody, ponieważInitjest terazasyncmetodą.Zaktualizuj metodę ,
AddNewPersonaby wstawić nowąPersonprzy użyciu asynchronicznej operacji wstawiania.Kod powinien wyglądać następująco:
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); } }
Pobieranie wszystkich elementów z tabeli asynchronicznie
Zmodyfikuj definicję
GetAllPeoplemetody. Ta metoda powinna byćasynci zwracaćTask<List<Person>>obiekt.awaitDodaj słowo kluczowe do wywołaniaInitmetody.Zaktualizuj metodę , aby zwrócić wyniki przy użyciu wywołania asynchronicznego.
Kod powinien wyglądać następująco:
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>(); }Zapisz plik PersonRepository.cs .
Testowanie funkcji asynchronicznych
Rozwiń węzeł MainPage.xaml w Eksploratorze rozwiązań i otwórz plik MainPage.xaml.cs.
Zmodyfikuj obie procedury obsługi zdarzeń kliknięcia przycisku, tak aby korzystały z metod asynchronicznych z
PersonRepositoryklasy . Użyjasyncsłów kluczowych i :awaitpublic 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; }Zapisz plik MainPage.xaml.cs .
Skompiluj i uruchom program w systemach Windows i Android, sprawdzając, czy nadal działa tak jak poprzednio.