תכנה שרצה משעה מסויימת עד שעה אחרת
-
בהמשך לקוד שמנטר את הרשת, אני רוצה שהוא ירוץ רק בטווח זמן מסוים. למשל מ20:00 עד 08:00 למחרת. בצורה קבועה כל יום.
לשם כך חשבתי להשתמש בטיימר, וכתבתי את הקוד הבא:public class Scanner { private DateTime timeStart { get; set; } private DateTime timeStop { get; set; } private Timer timer = new Timer(); TimeSpan difference; public Scanner(DateTime start, DateTime stop) { timeStart = start; timeStop = stop; } public void TimeTracking() { DateTime now = DateTime.Now; timer.Enabled = true; timer.AutoReset = true; //אם עדיין לא הגיע הזמן if (now < timeStart) { difference = timeStart - now; timer.Interval = difference.Ticks; timer.Elapsed += (s, e) => { StartUpScanner(); TimeTracking(); }; } else if (now >= timeStart && now < timeStop) { difference = timeStop - now; timer.Interval = difference.Ticks; timer.Elapsed += (s, e) => { StopScanner(); TimeTracking(); }; } else if (now > timeStart &&now >=timeStop) { //מכוון את הטיימר שיפעל למחרת difference = timeStart.AddDays(1) - now; timer.Interval = difference.Ticks; timer.Elapsed += (s, e) => { StartUpScanner(); TimeTracking(); }; } } private void StopScanner() { } private void StartUpScanner() { } }
זה אמור לעבוד טוב, נכון?
או שכדאי לעשות את זה באופן אחר?
תודה רבה ושבת שלום!
אברהם.פורסם במקור בפורום CODE613 ב20/01/2017 01:49 (+02:00)
-
נראה טוב, אך עליך לתקן בדחיפות את ההשמה מticks לinteval. כי האחרוןמקבל מילישניות, ואילו tick הוא לא אלפית השניה אלא מליונית שלה.
במקום זה תשתמש בTotalMiliseconds.
בנוסף בתנאי השלישי ההתניה now > timeStart היא כפל מיותר שהרי הוא גדול אף מהסיום, לא כן? החלק השני שלה, אף שהוא גם יוכל להיחשב כמיותר כי הרי זה האפשרות האחרונה, עוד סביר בשביל הקריאות.
שלישית - עדיף להשתמש בשביל זה בספריות מוכנות... מחר (אולי בשעה זו זה נחשב היום) אחפש - אני זוכר שיש כמה.פורסם במקור בפורום CODE613 ב20/01/2017 05:32 (+02:00)
-
תודה רבה על ההערות המחכימות!!
@דוד ל.ט.
בנוסף בתנאי השלישי ההתניה now > timeStart היא כפל מיותר שהרי הוא גדול אף מהסיום, לא כן? החלק השני שלה, אף שהוא גם יוכל להיחשב כמיותר כי הרי זה האפשרות האחרונה, עוד סביר בשביל הקריאות.
צודק, זה אכן מיותר.
תיקנתי את הקוד.
לא זוכר עכשיו למה עשיתי את זה.. אבל באמת אין בכך שום היגיון.אשמח לשמוע על ספריות מוכנות שעושות את זה.
כמו כן, כל פעם אני צריך גם להסיר את המנוי לאירוע הקודם (למשל כשאני קורא לאירוע הכיבוי אני צריך להסיר את אירוע ההדלקה), נכון?פורסם במקור בפורום CODE613 ב20/01/2017 11:17 (+02:00)
-
כמו כן, כל פעם אני צריך גם להסיר את המנוי לאירוע הקודם (למשל כשאני קורא לאירוע הכיבוי אני צריך להסיר את אירוע ההדלקה), נכון?
אכן! לא שמתי לב לזה, והבעיה היא שאתה לא יכול - זה הרי פונקציה אנונימית.
לדעתי תיצור טיימר חדש כל פעם.
אגב הטיימר של מרחב השמות Thrading מקבל TimeSpan ישירות כערך לinterval. לא כזה משמעותי.ספריות התכוונתי אכן לזאת ולדומים לה. אבל לא מספיק עיינתי בעניין.
תוכל לחפש:
C# scheduler action משהו כזה ותחפש משהו טוב.פורסם במקור בפורום CODE613 ב20/01/2017 12:26 (+02:00)