תחילת העבודה עם תיכנות אסינכרוני
מפתחים משתמשים בטכניקות תיכנות אסינכרוני כדי להימנע מצווארי בקבוק של ביצועים ולשפר את יכולת התגובה הכוללת של האפליקציות שלהם. עם זאת, טכניקות מסורתיות לכתיבה של אפליקציות אסינכרוניות יכולות להיות מורכבות, כך שקשה לכתוב, לאתר באגים ולתחזק אותן.
C# תומך בגישה פשוטה של תיכנות אסינכרוני שמנצלת תמיכה אסינכרונית בזמן הריצה של .NET. המהדר מבצע את העבודה הקשה שהמפתח עשה, ויישום שלך שומר מבנה לוגי הדומה לקוד סינכרוני. כתוצאה מכך, אתה מקבל את כל היתרונות של תיכנות אסינכרוני עם חלק קטן מהמאמץ.
הבנת האופן שבו תהליכים אסינכרוניים פועלים בעולם האמיתי יכולה לעזור לך להבין כיצד להשתמש בתיכנות אסינכרוני באפליקציות שלך.
בחינת תהליך אסינכרוני בעולם האמיתי
יצירת ארוחת בוקר היא דוגמה טובה לתהליך שנועיל בביצוע משימות באופן אסינכרוני. ניתן לחשוב על יצירת ארוחת בוקר כסידרה של משימות שניתן לבצע באופן סינכרוני או אסינכרוני.
- קבל את מרכיבי ארוחת הבוקר מן המזווה.
- מוזג קפה.
- מחממים מחבת, ואז מטגנים שלוש פרוסות של בייקון.
- צ'יפס שתי ביצים.
- להרים כוסית של שתי חתיכות לחם.
- מרחים חמאה וריבה על הטוסט.
- לשפוך של מיץ תפוזים.
אם יש לך ניסיון בבישול, תוכל להשלים הוראות אלה באופן אסינכרוני. אתה מתחיל בחימום מחבת עבור הבייקון וביצים, ולאחר מכן מקבל את המרכיבים מהמזווה. אתה שם את הלחם בטוסטר, ואז מתחיל לבשל את הבייקון. בכל שלב בתהליך, עליך להתחיל משימה ולאחר מכן לעבור למשימות אחרות המוכנות לתשומת לבך.
בישול ארוחת בוקר היא דוגמה טובה לעבודה אסינכרונית שאינה מקבילה. אדם אחד (או שרשור) יכול לטפל בכל הפעילויות. אדם אחד יכול ליצור ארוחת בוקר באופן אסינכרוני על-ידי התחלת המשימה הבאה לפני השלמת המשימה הקודמת. כל משימת בישול מתקדמת, בין אם מישהו צופה בתהליך באופן פעיל. ברגע שאתה מתחיל לחמם את מחבת, אתה יכול לקבל מרכיבים מן המזווה. אחרי שהבייקון מתחיל לבשל, אתה יכול לשים את הלחם בטוסטר.
עבור אלגוריתם מקביל, אתה זקוק למספר אנשים שמטבחים (או שרשורים מרובים). אדם אחד מבשל את הביצים, אחר טוגנים את הבייקון, וכן הלאה. כל אדם מתמקד בפעילות הספציפית אחת שלו. כל אדם אשר מבשל (או כל שרשור) חסום באופן סינכרוני וממתין להשלמת המשימה הנוכחית: בייקון מוכן להיפוך, לחם מוכן להקפצת טוסטר וכן הלאה.
על-ידי שימוש בטכניקות תיכנות אסינכרונית, באפשרותך לשפר את היעילות והתגובתיות של האפליקציה שלך, בדיוק כמו האופן שבו ניתן להפוך את ארוחת הבוקר ליעילה יותר על-ידי ביצוע משימות מרובות בבת אחת.
אסינכרון משפר את יכולת התגובה
אסינכרוני הוא חיוני לפעילויות שעלולות להיות חסימה, כגון גישה לאינטרנט. הגישה למשאב אינטרנט איטית או מושהית לעתים. אם פעילות כזו חסומה בתהליך סינכרוני, על היישום כולו להמתין. בתהליך אסינכרוני, היישום יכול להמשיך בעבודה אחרת שאינה תלויה במשאב האינטרנט עד שהפעילות שעשויה לחסום תהסתיים.
הטבלה הבאה מציגה אזורים אופייניים שבהם תיכנות אסינכרוני משפר את יכולת התגובה. ממשקי ה- API המפורטים מ- .NET ו- Windows Runtime מכילים שיטות התומכות בתיכנות אסינכרוני.
| אזור היישום | סוגי .NET עם שיטות אסינכרונית | סוגי זמן ריצה של Windows עם שיטות אסינכרונית |
|---|---|---|
| גישה לאינטרנט | HttpClient | Windows.Web.Http.HttpClient, SyndicationClient |
| עבודה עם קבצים | JsonSerializer, StreamReader, StreamWriter וכו'. | StorageFile |
| עבודה עם תמונות | MediaCapture, BitmapEncoder, BitmapDecoder | |
| תיכנות WCF | פעולות סינכרוניות ואסינכרוניות |
כיצד ליצור פעולות שירות אסינכרוניות ולבצע אליהן קריאה
ב- C#, פעולות אסינכרוניות המיושמות באמצעות מילות async המפתח await ו- . מילת async המפתח משמשת להגדרת שיטה אסינכרונית, await בעוד מילת המפתח משמשת להתקשרות לפעולת שירות אסינכרונית ולהמתין לתוצאה שלה מבלי לחסום את הליך המשנה של השיחות. הפעולות הסינכרוניות TaskTask<T> מיושמות בדרך כלל באמצעות הסוגים או, המייצגים פעולה מתמשכת שניתן להמתין לה.
להלן דוגמה של יצירת משימה אסינכרונית ושיחה אליה ב- C#:
using System;
using System.IO;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
string filePath = "example.txt";
string content = await ReadFileAsync(filePath);
Console.WriteLine(content);
}
public static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
string content = await reader.ReadToEndAsync();
return content;
}
}
}
בדוגמה זו, פעולת ReadFileAsync השירות מוגדרת באמצעות מילת async המפתח ויש לה סוג החזרה של Task<string>. מילת async המפתח מציינת כי פעולת השירות מכילה פעולות אסינכרוניות, Task<string> וסוג ההחזרה של מציין כי פעולת השירות מחזירה פעילות המייצגת את הפעולה הסינכרונית. הסוג Task<string> הוא פעילות כללית המייצגת פעולה אסינכרונית המחזירה ערך מחרוזת. פעולת ReadFileAsync השירות מקבלת נתיב קובץ בפרמטר והקריאה של תוכן הקובץ באופן אסינכרוני.
פעולת Main השירות מוגדרת גם כ' אסינכרונית, ומאפשרת לה לקרוא לפעולת השירות ReadFileAsync באמצעות מילת await המפתח. מילת await המפתח משמשת כדי לציין שהתוכנית צריכה להמתין לתוצאה של הפעולה הסינכרונית לפני שתמשיך. במקרה זה, התוכנית תמתין לקריאת הקובץ לפני הדפסת התוכן שלו בקונסולה.
תקציר
ביחידה זו, למדת על היתרונות של תיכנות אסינכרוני וכיצד הוא יכול לשפר את יכולת התגובה של היישומים שלך. למדת גם כיצד ליצור פעולות שירות אסינכרוניות ולקרואות באמצעות מילות המפתח async ו await - ב- C#. על-ידי שימוש בטכניקות אלה, באפשרותך לכתוב יישומים יעילים ומגיבים יותר העשויים לטפל בפעולות שעלולות לחסום מבלי להקפיא את ממשק המשתמש או לחסום משימות אחרות.
נקודות עיקריות
- תיכנות אסינכרוני משפר את ביצועי האפליקציות ואת יכולת התגובה.
- C# מספק גישה פשוטה יותר לתכנות אסינכרוני.
- תיכנות אסינכרוני מועיל בפעילויות שעלולות לחסום, כגון גישה לאינטרנט.
- ב- C#, פעולות שירות אסינכרוניות נוצרות באמצעות מילת
asyncהמפתח והן נקראות באמצעות מילתawaitהמפתח. -
Taskהסוגים אוTask<T>מייצגים פעולות מתמשכת שניתן להמתין לה ב- C#.