לגבי 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().