async או thread
-
אני בונה אפליקציית webAPI ב ASP.NET.
אני לא שואל לגבי הפונקציות של ה API ב Controller, שהם צריכות להיות אסינכרוניות כדי לאפשר קריאות רבות בו זמנית.
השאלה שלי היא בנקודה אחרת (שאינה קשורה ל webAPI, רק ציינתי את זה למקרה ויש הבדל בביצוע): אני מתחבר לשרת צד ג באמצעות API, ושם יש לי אירוע שמתרחש בעת הוספת משתמש חדש לדוגמא, כשהאירוע נקרא אני רוצה להפעיל אצלי כמה פונקציות בלי לפספס באותו זמן קליטת אירועים נוספים מסוג האירוע הזה ומסוגים אחרים, האם כאן מתאים יותר async או thread?תודה
פורסם במקור בפורום CODE613 ב06/03/2017 16:38 (+02:00)
-
קודם כל בASP.NET כל request זה טריד בפני עצמו. טריד שנוצר אחריו יכול לעקוף אותו ושימוש במשאב משותף (כמו משתנה סטטי) צריך להיעשות תוך לקיחה בחשבון את האסינכרוניות.
@אביושם יש לי אירוע שמתרחש בעת הוספת משתמש חדש לדוגמא, כשהאירוע נקרא אני רוצה להפעיל אצלי כמה פונקציות בלי לפספס באותו זמן קליטת אירועים נוספים מסוג האירוע הזה ומסוגים אחרים
לא ברור מה אתה מפחד לפספס. אין בחיים מצב של פספוס יש מצב של אי סדר. אם תפרט מה אתה חושש יהיה קל יותר לייעץ.
פורסם במקור בפורום CODE613 ב06/03/2017 20:09 (+02:00)
-
-
טוב, אתה כתבת ואני לא הבנתי ואתה אכן כתבת אבל אני אכן לא הבנתי
אז אם אם אני מבין נכון שאתה חושב שבגלל בו זמניות יהיה איזה "אירוע" כלומר לא תופעל מתודה כל שהיא וכדומה, אז אתה יכול להיות רגוע לגמרי. לא זה הסיכונים של בו זמניות. הבעיה מתחילה כשיש קשר בין דברים שנעשים בו זמנית, למשל כשאתה שם במשתנה סטטי מידע ששייך לפעולה אחת והוא נכתב מחדש ע"י האחרת, או אתה מתבסס על ערך שיש בו ועד שאתה פועל הערך כבר שונה וכדומה.
פורסם במקור בפורום CODE613 ב07/03/2017 00:37 (+02:00)
-
כנראה לא הסברתי את עצמי טוב.
כשמתרחש בשרת הוספת משתמש חדש, האירוע באפליקציה שלי מופעל, ומפעיל מתודה כל שהיא, נניח מתודה שמדפיסה אותו 100000 פעמים, משהו שלוקח זמן..
בזמן שהמתודה הזאת מדפיסה ומדפיסה, התווסף עוד משתמש חדש, מה קורה אז? האירוע אצלי באפליקציה מופעל שוב? ממתין? או שהוא עסוק עם ההדפסה הקודמת?
כנ"ל לגבי אירועים אחרים שמתרחשים בשרת ואמורים להיקלט ע"י אירועים שונים באפליקציה, מה קורה איתם?תודה
פורסם במקור בפורום CODE613 ב07/03/2017 10:39 (+02:00)
-
מה שקורה הוא הפעלה בו זמנית של המשהו שלוקח זמן אין בזה בד"כ שום בעיה. אבל כיון שזה לוקח זמן כדאי להשתמש עם async (כלומר Task) לא בגלל בעיית ה"בו זמניות" אלא בשביל לא לתקוע את הטריד של התשובה (לא מבין אבל ככה אני יודע). טריד מיותר פה כי בכל מקרה זה רץ ברטיד שונה.
פורסם במקור בפורום CODE613 ב07/03/2017 11:19 (+02:00)
-
כל אירוע מופעל בטריד אחר?
כל אירוע שייך לטריד שהפעיל אותו.
@אביולמה בבקשות APIזה לא כך?
כל בקשה היא [u:2agpjtqj]כן[/u:2agpjtqj] טריד אחר (אלא"כ הבקשה הקודמת נגמרה שאז נעשה שימוש חוזר בטריד הקודם).
תוכל להיווכח בכך אם תוסיף לתשובה את הערך Thread.CurrentThread.ManagedThreadId ותראה שהוא משתנה.פורסם במקור בפורום CODE613 ב09/03/2017 11:55 (+02:00)
-