איך לאפשר את חווית ה Console גם ב WindowsService
post זה הוא המשך של קודמו: תמיכה ב WindowsService בזמן פיתוח.
בזמן שננצל את היכולת שהוצגה בpost הקודם, והיא עבודה אינטראקטיבית מליאה בזמן פיתוח, נוכל להציג מידע שחשוב לנו, בחלון ה Console.
יתכן שמידע tracing זה, יהיה חשוב לנו גם בזמן שנריץ את הקוד כ WindowsService ולא רק בזמן ההרצה כ Console Application.
איך נדאג לכך?
ראשית, בזמן עבודה כ Service נצטרך להפרד מידידנו האהוב ה Console. אין שום דרך להציג אותו, הלא בחרנו ב service שאינו אינטראקטיבי.
במקום חלון ה console נוכל להסתפק בקובץ.
אם כך, במה זה שונה מ log? זה לא שונה, פרט להתנהגות אחת: זה אותו המידע שאנו מציגים בחלון ה Console בסביבת הפיתוח.
לשם כך, נשתמש ב Trace (מתוך System.Diagnostics) ולא ב Console.Write.
נדאג שהודעות ה Trace יוצגו הן בחלון ה Console והן בקובץ יעודי, בהתאם לסביבת הריצה.
בדוגמא הבאה, נציג את הקונפיגורציה של שני המצבים כאחד (אם כי בד"כ דרוש לנו רק אחת משתי האפשרויות):
1: <system.diagnostics>
2: <trace autoflush="true" indentsize="4">
3: <listeners>
4: <add name="fileListener" type="System.Diagnostics.TextWriterTraceListener"
5: initializeData="c:\logs\tracing.log" />
6: <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
7: </listeners>
8: </trace>
9: </system.diagnostics>
TextWriterTraceListener – כשמו, רושם לתוך הקובץ המוגדר ב initializeData
ConsoleTraceListener – רושם את ההודעות לחלון ה Console.
כדי לתת ממשק זהה ונוח כמו של Console.Write הוספתי class שמבצע זאת. בנוסף, הוא גם מוסיף חתימה של זמן לכל הודעת Trace.
קטע דוגמא:
1: public static class Tracing
2: {
3: public static void WriteLine(string format, params object[] args)
4: {
5: TraceTimestamp();
6: Trace.WriteLine(string.Format(format, args));
7: }
8:
9: //More methods here
10:
11: private static void TraceTimestamp()
12: {
13: Trace.Write(DateTime.Now.ToString("dd/MM/yyy hh:mm:ss.fff => "));
14: }
15: }
16:
להורדת הקוד לכל הסדרה
ה post הבא בנושא: Self Installing WindowsService -שרות שיודע להתקין את עצמו