-
סביבת פיתוח: c# from
רקע:
אני מריץ את התוכנה בשרת מקומי
שמספר משתמשים מתחברים אליו במקביל (באמצעות RDP)כך שכל משתמש פותח ומשתמש בתוכנה עצמונית
הקושי:
ע"מ לבצע עדכוני תוכנה אני צריך שכל המשתמשים יסגרו את התוכנה הפתוחה אצלם
היות וכידוע לא ניתן למחוק/להחליף קובץ פתוח שרץ ברקעשאלה:
-
איך אני יכול לבצע פקודת סגירה לכל ההפעלות הפתוחות במחשב זה - לכל המשתמשים
(Application.Exit סוגר את החיבור הנוכחי למשתמש פרטני בלבד) -
איך אני מבצע סגירה אוטומטית של התוכנית כל יום בשעה מסוימת
(אני משער שמדובר בלולאת FOR הבודקת מה השעה, ולפי זה מפעילה IF, אשמח לעזרה בתחביר, ולהיכן להצמיד אותה)
-
-
@mekev
אתה יכול גם ליצור טריגר מהשרת שלך (איך אתה מתכנן לבצע עדכון מרחוק בלי זה?)בצורה הכי פשוטה שלא מצריכה הבנה ברשתות -
אתה מעלה קובץ טקסט עם הגירסא של השרת לאיזה אתר פומבי כלשהו (אפשרי github),
התוכנה בודקת כל כמה זמן (תבחר אתה כמה) באמצעות WebClient.DownloadString() את הגירסא המעודכנת (הURL צריך להיות לקובץ טקסט שהעלת), אם זה לא תואם לגירסא שקיימת ללקוח (זה יכול להיות בקובץ קונפיגורציה app.config, וזה גם יכול להיות משתנה גלובלי) אז התוכנה תבצע סגירה לכל הHandlerים הפתוחים, תעדכן את עצמה, ותבצע פתיחה מחדש של עצמה.ברגע שאתה רוצה לעדכן גירסא אתה פשוט משנה בקובץ טקסט שנמצא בגיטהאב את המספר גירסא.
-
var current = Process.GetCurrentProcess(); Process.GetProcessesByName(current.ProcessName) .Where(p => p.Id != current.Id) .ToList() .ForEach(p => p.Kill()); current.Kill();
הסבר בקצרה:
- קבלת התהליך הנוכחי.
- קבלת כל התהליכים הפעילים החולקים את שמם עם התהליך הנוכחי (מלבד התהליך הנוכחי עצמו - אנו זקוקים לשמר אותו בחיים בשלב זה).
- סגירת כל התהליכים שבתוצאה.
- סגירת התהליך הנוכחי.
מומלץ להעדיף את השימוש בProcess.CloseMainWindow (המבקש מהתהליך בצורה מנומסת לסיים [Graceful exit]) על פני השימוש בProcess.Kill (המסיים את התהליך מייד, מה שעלול לגרום לתופעות שאינן רצויות) אם כי לא תמיד השימוש בו אפשרי, אולם תמיד ניתן להשתמש בProcess.Kill כFallback במקרה של כישלון:
if (!p.CloseMainWindow()) p.Kill();
קרדיט: Exit all instances of my app
** דוטנט מציעה מספר מחלקות טיימר (כדוגמת system.timers וsystem.threading.timer)
-