הפעלת פונקציה אסינכרונית ללא await
-
@dovid אמר בהפעלת פונקציה אסינכרונית ללא await:
רק תרשה לי לשחרר את הבקשה
שחרור הבקשה מתבצע (בלי לקחת בחשבון Filters וMiddlewares) בעת הרצת הreturn (גם בעת כתיבה ישירה לBody) לאחר מכן הController ושאר הServices שרשומים כScope יושמדו (תיאורטית ניתן להזריק את IServiceScopeFactory (שהוא Singleton) ולבקש את הServices הדרושים גם אחרי שהבקשה הושלמה, אם כי הבעיה הגדולה של טיפול בשגיאות עדיין קיימת)
-
@רפאל אמר בהפעלת פונקציה אסינכרונית ללא await:
הדרך המומלצת להריץ משימות רקע בASP.NET בפרט ובNET. בכלל, היא שימוש בHosted Service
מכיר את זה, יש גם כלים לניהול ג'ובים וכדומה. זה לא התרחיש.
@dovid אמר בהפעלת פונקציה אסינכרונית ללא await:
@רפאל לא אכפת לי "להמתין", רק תרשה לי לשחרר את הבקשה עם תשובה מוגמרת ("OK אנחנו תיכף עושים זאת").
זה בדיוק התרחיש, אני רוצה שהמערכת תעשה "עוד כמה סידורים קטנים" אחרי שהתקבלה תשובה, בשביל זה אני חייב להרים מפלצות? ולפבלש אותם עם כל שינוי?
הרי הארכיטקטורה לפי דבריך תהיה רישום בקובץ טקסט שיש "משימה לעשות" ואז הסרביס השני יבצע את זה. לא הרעיון הכי נקי בעולם.... אבל אם זה מה יש מי אני שתאווכח. -
@רפאל אמר בהפעלת פונקציה אסינכרונית ללא await:
@ארכיטקט לא ברור לי למה אתה קורה "התרחיש". הפתרון שהצעתי הוא הפתרון היעיל ביותר שקיים היום עבור פעולות אסינכרוניות קצרות וארוכות כאחד.
הדוגמא ש @dovid נתן היא קלאסית, יוזר לוחץ על לחצן "שלח מיילים לכל המדינה", או "שלח חיוב לעשרה מיליארד כרטיסי אשראי", וכל כיו"ב.
הוא מקבל הודעה OK 200 "תודה לך, אנחנו מטפלים בבקשה שלך, אתה יכול להמשיך בענייניך". מתוך הנחה שהפרוסס ימשיך, איתו או בלעדיו. עד שיסיים את שלו.
במקום זה עלי להיות מוטרד מכך שמא יסגור את הטאב ויהרוג את הריקווסט וכן הלאה. ועל מנת שלא להיות מוטרד מכך, עלי לרשום בקובץ טקסט בדיסק הקשיח או בכל מקום פרסיסטנטיאלי, לבצע משימה נפרדת וכן הלאה. מקווה שאני מובן מספיק טוב. -
@ארכיטקט אמר בהפעלת פונקציה אסינכרונית ללא await:
עלי לרשום בקובץ טקסט בדיסק הקשיח... לבצע משימה נפרדת וכן הלאה.
פספסתי. אני חושד שיש לנו חוסר הבנה.
אופן הוספת המשימות לתור זהה ואינו תלוי כלל בטיב המשימה:
[HttpPost] public Guid Post(Model model) { return _queue.Enqueue((ct, sp) => sp.GetService<ISomeService>().DoAsync(model, ct)); }
-
@ארכיטקט ממש לא, גם לא Thread בפני עצמו.
HostedService זה Service מסוג סינגלטון רגיל אך בעל Lifetime משלו (נוצר בתחילת הריצה של האפליקציה [בניגוד לServices רגילים הנוצרים לפי הצורך], ומושמד בסיום הריצה), אין בו שום קסם אולם הוא מהווה פלטפורמה נחוצה להרצת משימות ארוכות או מתוזמנות.