Windows Service - עבודה נכונה + שאלה לוגית

ExtraSi

New member
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,
אבל אז תהיה בעיה ששליחת המייל תתבצע יותר מפעם אחת.
אני יכול לפתור זאת כמובן ע"י שמירה בבסיס הנתונים את הימים שבהם שליחת המייל כבר התבצעה,
אבל אני מחפש דרך לוגית לבצע זאת ללא השמירה, האם אפשרי?
 

Dניאל Mור

New member
למרות שהשאלה שלך מאד מעניינת - האם אתה בטוח

שאתה בפורום הנכון?
 

ירון316

New member
אמנם לא הפורום הנכון...

אבל בתשובה ל-3, אתה יכול להגדיר משתנה בוליאני של "מייל נשלח" או "מייל לא נשלח", שמתאפס בכל יום ב-00:01, ועובר ל-1 ברגע שהמייל נשלח. ככה לא צריך דאטהבייס.
אבל שאלת תכנות? בווינדוס? בפורום לינוקס?
 
למעלה