Windows Service - עבודה נכונה + שאלה לוגית
עד היום, כל ה Windows Services שיצא לי לראות, עבדו בצורה מאוד דומה,
ומעבר להפרדה בין ה Host Class ל Class המממש את הפונקציונאליות (חשוב, אם נרצה לשנות את ה Host),
עבדו בצורה הבאה:
כאשר ה Service עולה, מייצרים Thread, מעבירים אליו את המתודה לביצוע (לדוגמא, FoFo) ומבצעים לו Start:
Thread th = new Thread(new ThreadStart(FoFo));
th.Start();
בתוך FoFo יש לולאת While המתבצעת כל עוד דגל מסויים הוא True,
בסוף כל איטרציה של הלולאה יש Sleep מסויים לקראת האיטרציה הבאה ,
והדגל הנ"ל משתנה ל False כאשר מתבצע Stop ל Service,
אשמח לדעת:
1. מדוע יש צורך ליצר Thread? מדוע לולאת ה While לא יכולה להתבצע בדיוק במקום שורות הקוד המייצרות Thread?
2. האם יש דרך אלגנטית יותר מאשר לולאת שרצה כל הזמן על Sleep עד שהדגל מסמן להפסיק?
אין אפשרות להגדיר ל Windows Service שכל עוד הסרביס רץ, שיריץ את FoFo כל X דקות (נניח)?
והשאלה שהכי מעניינת אותי:
3. נניח שאני רוצה שבין שאר הדברים, ה Service יבצע משימה מסויימת פעם ביום בשעה קבועה,
לדוגמא, שבכל יום בשעה 13:00 ישלח מייל.
מה הדרך הבטוחה לעשות זאת, ולא פחות חשוב, שהסרביס לא יבצע זאת פעמיים ביום?
לא כדאי לבדוק בכל איטרציה שהגיעה בדיוק השעה 13:00:00, מכיוון שבשל ה Sleep (בין השאר), אפשר לפספס.
אני יכול להגדיר טווח זמנים, לדוגמא, לבצע את שליחת המייל בין 13:00 - 13:05,
אבל אז תהיה בעיה ששליחת המייל תתבצע יותר מפעם אחת.
אני יכול לפתור זאת כמובן ע"י שמירה בבסיס הנתונים את הימים שבהם שליחת המייל כבר התבצעה,
אבל אני מחפש דרך לוגית לבצע זאת ללא השמירה, האם אפשרי?
עד היום, כל ה Windows Services שיצא לי לראות, עבדו בצורה מאוד דומה,
ומעבר להפרדה בין ה Host Class ל Class המממש את הפונקציונאליות (חשוב, אם נרצה לשנות את ה Host),
עבדו בצורה הבאה:
כאשר ה Service עולה, מייצרים Thread, מעבירים אליו את המתודה לביצוע (לדוגמא, FoFo) ומבצעים לו Start:
Thread th = new Thread(new ThreadStart(FoFo));
th.Start();
בתוך FoFo יש לולאת While המתבצעת כל עוד דגל מסויים הוא True,
בסוף כל איטרציה של הלולאה יש Sleep מסויים לקראת האיטרציה הבאה ,
והדגל הנ"ל משתנה ל False כאשר מתבצע Stop ל Service,
אשמח לדעת:
1. מדוע יש צורך ליצר Thread? מדוע לולאת ה While לא יכולה להתבצע בדיוק במקום שורות הקוד המייצרות Thread?
2. האם יש דרך אלגנטית יותר מאשר לולאת שרצה כל הזמן על Sleep עד שהדגל מסמן להפסיק?
אין אפשרות להגדיר ל Windows Service שכל עוד הסרביס רץ, שיריץ את FoFo כל X דקות (נניח)?
והשאלה שהכי מעניינת אותי:
3. נניח שאני רוצה שבין שאר הדברים, ה Service יבצע משימה מסויימת פעם ביום בשעה קבועה,
לדוגמא, שבכל יום בשעה 13:00 ישלח מייל.
מה הדרך הבטוחה לעשות זאת, ולא פחות חשוב, שהסרביס לא יבצע זאת פעמיים ביום?
לא כדאי לבדוק בכל איטרציה שהגיעה בדיוק השעה 13:00:00, מכיוון שבשל ה Sleep (בין השאר), אפשר לפספס.
אני יכול להגדיר טווח זמנים, לדוגמא, לבצע את שליחת המייל בין 13:00 - 13:05,
אבל אז תהיה בעיה ששליחת המייל תתבצע יותר מפעם אחת.
אני יכול לפתור זאת כמובן ע"י שמירה בבסיס הנתונים את הימים שבהם שליחת המייל כבר התבצעה,
אבל אני מחפש דרך לוגית לבצע זאת ללא השמירה, האם אפשרי?