תרגיל: השתמש בפונקציה SQLite באופן אסינכרוני
היישום פועל היטב, אך אם מסד הנתונים מכיל שורות רבות, ממשק המשתמש יכול להפסיק להגיב בזמן שהיישום מבצע שאילתות מסד נתונים ופעולות אחרות. בתרגיל זה, תמיר את היישום מה- API הסינכרוני SQLite לגירסה האסינכרונית. בדרך זו, היישום שלך תמיד מגיב ללא קשר למספר השאילתות שתבצע במסד הנתונים.
יצירת חיבור אסינכרוני
פתח את PersonRepository.cs הקובץ בחלון אנשים זה.
שנה את
Initשל פעולת השירות הבאה כך שהיאasync. שנה את סוג ההחזרה של פעולת השירות ל-Task.שנה
connהמאפייןSQLiteAsyncConnectionועדכן את הקוד בפעולת השירותInitשאתחול החיבור.החלף את השיחה בפעולת השירות
CreateTableהסינכרונית בפעולת השירותCreateTableAsyncהסינכרון.הקוד שהושלם אמור להיראות כך:
private SQLiteAsyncConnection conn; private async Task Init() { if (conn != null) return; conn = new SQLiteAsyncConnection(_dbPath); await conn.CreateTableAsync<Person>(); }
הוספת פריט לטבלה באופן אסינכרוני
שנה את ההגדרה של פעולת
AddNewPersonהבאה כך שלאasync. שנה את סוג ההחזרה של פעולת השירות ל-Task.הוסף את
awaitהמפתח הבאהInitזו מכיווןInitהיא כעת שיטתasyncאישית.עדכן
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); } }
קבלת כל הפריטים מטבלה באופן אסינכרוני
שנה את
GetAllPeopleפעולת השירות. פעולת שירות זו צריכה להיותasyncולהחזיר אובייקטTask<List<Person>>אחר.הוסף את
awaitהמפתח הבאהInitזו.עדכן את פעולת השירות כדי להחזיר את התוצאות באמצעות קריאה אסינכרונית.
הקוד אמור להיראות כך:
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>(); }שמור את PersonRepository.cs הקובץ.
בדיקת הפונקציונליות הסינכרונית
הרחב MainPage.xaml בסייר הפתרונות ופתח את MainPage.xaml.cs הקובץ.
שנה את שני המטפלים באירועים בלחיצה על הלחצן כך שהם ישתמשו בפעולות שירות אסינכרוניות מהמחלקה
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; }שמור את MainPage.xaml.cs הקובץ.
בנה והפעל את התוכנית ב- Windows וב- Android, וודא שהיא עדיין פועלת כמו בעבר.