async / await - אם תוכלו לעשות לי סדר בענין....

java

משתמש סופר מקצוען
מנוי פרימיום
הנדסת תוכנה
כשאת עושה פעולה א-סיכנרונית. (כמו למשל, מחכה לתשובה מAPI חיצוני)
כי את מעוניינת לחכות שהפעולה תסתיים לפני ההמשך.
לדוג', כשאת צריכה את התשובה בשביל שימוש בהמשך.

זה על קצה המזלג, בהסבר פשטני ולא מקצועי.
אם את מעוניינת בהרחבה או בהסבר מקיף יותר -
עדיף שהיית מנסה למקד את השאלה.
 

תכנות זה עולם

משתמש רשום
השאלה שלי נבעה מכך שנתקלתי בפונקציה שמוגדרת כך:(C#)
public async Task<IHttpActionResult> func() { }
בפונקציה הזאת יש שורה:
var result = await Request.Content.ReadAsMultipartAsync(provider
ואותה אני לא מבינה!!

אני כיום מתעסקת עם promise / observeble שזאת הדרך החדשה לשימוש בcallback - עם callback עצמו לא התעסקתי..
 

גזעי

משתמש מקצוען
הנדסת תוכנה
D I G I T A L
לגבי JAVASCRIPT:
פעם היו צריכים ליצור לכל דבר callback, והיה אפשר להיתקל בקולבק מקונן אפילו 10 פעמים.
אז בשביל זה המציאו את הPromise, אפשרות לקרוא לקולבק בלי לקונן אותו בתוך עוד קולבקים.
אחרי זה החליטו שפונקציה שאינה חוסמת את רצץ ההרצה, יכולה לקרוא לקוד שכן חוסם, כלומר פונקציה "אסינכרונית" (async) יכולה לקרוא לפונקציה אסינכרונית אחרת בצורה סינכרונית ע"י כך שהיא מחכה לה (await).

לגבי C#,
פעם הכל היה סינכרוני! מה שלא היה סינכרוני היה דורש הבנה טובה מאוד של תכנות מבוזר, אז בשביל לפשט עניינים יצרו את TASK בצורתו הבסיסית ביותר, את קוראת לפונקציה אסינכרונית בתהליכון משלה, ואחר כך צריכה לקבל את הערך מהTASK, אחד היתרונות של פונקציה "אסינכרונית" היא שהיא יכולה לקרוא לפונקציות אסינכרוניות אחרות ולחכות להן.

למשל:
public async Task<IHttpActionResult> func() { }
זה פונקציה שמחזירה TASK (עובד בצורה דומה לתהליכון שמחזיר ערך, אבל לא באמת פותח תהליכון נוסף) שהערך המוחזר של הTASK הוא אובייקט שמממש ממשק IHttpActionResult, או בקיצור זו פונקציה שמחזירה בצורה אסינכרונית תוצאות של בקשת HTTP

לכתוב AWAIT זה בשביל לקחת פונקציה אסינכרונית (שמחזירה ממשק RESULT כלשהו) בתור הRESULT בפועל בצורה סינכרונית, אבל אפשר לעשות את זה רק בתוך פונקציה אסינכרונית.

בדוגמה שהבאת:
var oldUser = await database.Users.Where(u => u.user_id == user.user_id).FirstOrDefaultAsync

זה מיותר, כי יש פונקציה סינכרונית קיימת FirstOrDefault().
 

אשת_חבר

משתמש מקצוען
משתמשת הרבה בתכנות א-סנכרוני אבל לא מצליחה להבין עד הסוף.
מתי ולמה אני משתמשת בawait?
אם מישהו יוכל להסביר פה זה נראה לי יוכל להיות לתועלת הרבים.
רוב בני אדם מתקשים להבין א-סינכרוני כי אנחנו חושבים בצורה סינכרונית וקשה לנו עם הקונספט.
אמשיל משל, אני באמצע להכין עוגה וגיליתי שחסר לי אבקת סוכר לציפוי
שלחתי את בני למכולת שיקנה אבקת סוכר
המשכתי להכין את העוגה
חיכיתי לבן שלי שיחזור מהמכולת AWAIT
או אם חזר לפני
השתמשתי באבקת סוכר לציפוי. RESULT
בתאבון
 

תכנות זה עולם

משתמש רשום
תודה על ההסברים! זה עזר לי להבין הרבה, אבל שאלה אחת עוד נותרה לי:
נניח שיש לי שתי פונקציות בצד שרת שמבצעות שליפה מהDB, להלן חתימת הפונקציות:
1. public async Task<IHttpActionResult> (בפונקציה זו משתמשים בawait בעת פניה לDB)
2. public IHttpActionResult
מה יהיו ההבדלים ביניהם?
אני יודעת שבפונקציה הראשונה הawait משחרר את הthread שלא יעצור וימתין לתשובה מהDB.
אבל על מה זה משליך? רק על כך שלמשך שניה התפנה thread? זה כ"כ משמעותי?
 

אסתר א

על ציר מחשבים ומוזיקה..
מנוי פרימיום
מוזיקה ונגינה
הנדסת תוכנה
D I G I T A L
לגבי JAVASCRIPT:
פעם היו צריכים ליצור לכל דבר callback, והיה אפשר להיתקל בקולבק מקונן אפילו 10 פעמים.
אז בשביל זה המציאו את הPromise, אפשרות לקרוא לקולבק בלי לקונן אותו בתוך עוד קולבקים.
אחרי זה החליטו שפונקציה שאינה חוסמת את רצץ ההרצה, יכולה לקרוא לקוד שכן חוסם, כלומר פונקציה "אסינכרונית" (async) יכולה לקרוא לפונקציה אסינכרונית אחרת בצורה סינכרונית ע"י כך שהיא מחכה לה (await).

לגבי C#,
פעם הכל היה סינכרוני! מה שלא היה סינכרוני היה דורש הבנה טובה מאוד של תכנות מבוזר, אז בשביל לפשט עניינים יצרו את TASK בצורתו הבסיסית ביותר, את קוראת לפונקציה אסינכרונית בתהליכון משלה, ואחר כך צריכה לקבל את הערך מהTASK, אחד היתרונות של פונקציה "אסינכרונית" היא שהיא יכולה לקרוא לפונקציות אסינכרוניות אחרות ולחכות להן.

למשל:
public async Task<IHttpActionResult> func() { }
זה פונקציה שמחזירה TASK (עובד בצורה דומה לתהליכון שמחזיר ערך, אבל לא באמת פותח תהליכון נוסף) שהערך המוחזר של הTASK הוא אובייקט שמממש ממשק IHttpActionResult, או בקיצור זו פונקציה שמחזירה בצורה אסינכרונית תוצאות של בקשת HTTP

לכתוב AWAIT זה בשביל לקחת פונקציה אסינכרונית (שמחזירה ממשק RESULT כלשהו) בתור הRESULT בפועל בצורה סינכרונית, אבל אפשר לעשות את זה רק בתוך פונקציה אסינכרונית.

בדוגמה שהבאת:
var oldUser = await database.Users.Where(u => u.user_id == user.user_id).FirstOrDefaultAsync

זה מיותר, כי יש פונקציה סינכרונית קיימת FirstOrDefault().
תודה. מפורט ומוסבר מעולה

רק לגבי המיותר, זה לא מיותר, זה משפיע מאוד על הביצועים.
אנחנו המרנו לוגיקה שלמה, שכן הייתה חייבת להתבצע ברצף, לasync await

אני חושבת שהtask מנוהל מחוץ לtread הראשי (ובכך זה משפר את הביצועים ומהירות תגובה)
אבל צריכה לבדוק את זה. לא מוסמך
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קכד

א שִׁיר הַמַּעֲלוֹת לְדָוִד לוּלֵי יְהוָה שֶׁהָיָה לָנוּ יֹאמַר נָא יִשְׂרָאֵל:ב לוּלֵי יְהוָה שֶׁהָיָה לָנוּ בְּקוּם עָלֵינוּ אָדָם:ג אֲזַי חַיִּים בְּלָעוּנוּ בַּחֲרוֹת אַפָּם בָּנוּ:ד אֲזַי הַמַּיִם שְׁטָפוּנוּ נַחְלָה עָבַר עַל נַפְשֵׁנוּ:ה אֲזַי עָבַר עַל נַפְשֵׁנוּ הַמַּיִם הַזֵּידוֹנִים:ו בָּרוּךְ יְהוָה שֶׁלֹּא נְתָנָנוּ טֶרֶף לְשִׁנֵּיהֶם:ז נַפְשֵׁנוּ כְּצִפּוֹר נִמְלְטָה מִפַּח יוֹקְשִׁים הַפַּח נִשְׁבָּר וַאֲנַחְנוּ נִמְלָטְנוּ:ח עֶזְרֵנוּ בְּשֵׁם יְהוָה עֹשֵׂה שָׁמַיִם וָאָרֶץ:
נקרא  10  פעמים

לוח מודעות

למעלה