C# - Feladatütemező alkalmazás készítése

forráskód letöltése
A Windows operációs rendszer nagyon hasznos alkalmazása a Feladatütemező, mely megadott időben képes tetszőleges programokat futtatni. Előfordulhat, hogy ezt a funkciót alkalmazásunk részévé kívánjuk tenni. Cikkünkben elkészítünk egy lehetséges változatot ennek megvalósítására, bemutatva milyen módon tudjuk megoldani azt, hogy a példaprogram is képes legyen a megadott feladatot időzítve elvégezni.
A példa kipróbálása előtt telepítenünk kell a SWinService projekt által generált assembly-t a szervizalkalmazások közé a következőképpen: indítsunk el egy Visual Studio.NET Command Prompt-ot, majd gépeljük be az installutil <elérési út>\SWinService.exe sort.
A megoldás lényege, hogy a programjainkat egy Windows-os szervizalkalmazás futtatja időzítve. A kliensalkalmazásban kiválasztjuk a futtatandó programot, és elérési útvonalát, valamint a futtatás időpontjának óra és perc összetevőjét egy-egy bejegyzés formájában eltároljuk a Rendszerleíró adatbázis egy meghatározott kulcsában.
A szervizalkalmazás innen olvassa ki a szükséges információkat és megvizsgálja, hogy az aktuális idő óra és perc összetevői melyik futtatandó alkalmazás esetén egyeznek meg ezzel.
A szervizalkalmazás jellemzői
A szervizalkalmazás installálásakor létrejön egy SoftwareOnline nevű kulcs a HKEY_LOCAL_MACHINE\Software kulcs alatt, ide kerülnek majd a bejegyzések. A szervizalkalmazás eltávolításakor (installutil /u <elérési út>\SWinService.exe) a kulcs törlésre kerül minden albejegyzésével együtt.
Amennyiben a műveletek folyamán a szerviz oldalon hiba történik, akkor a rendszer eseménynaplójának alkalmazáshoz kötődő szegmensébe (TService) kerül egy, a hibáról tájékoztató bejegyzés.
A szervizalkalmazásban létrehozunk egy System.Timers.Timer típusú időzítőt, melynek Elapsed nevű eseményének kezelőjébe ágyazzuk a megoldás kódját.
timer1.Elapsed += new ElapsedEventHandler(timer1_Tick);
A kezelő percenként fut le, így minden percben megvizsgálhatjuk a listánkat, és elindíthatjuk a benne szereplő alkalmazásokat. Sajnos a programokat csak a háttérben futtatva indíthatjuk el, így a megoldás olyan esetekben használható, amikor valamilyen felhasználói beavatkozást nem igénylő, rendszeresen elvégzendő műveletet végrehajtó folyamatot kell elindítanunk. Ilyen lehet például egy adatbázist mentő alkalmazás.
A szervizalkalmazás indításakor engedélyezzük, leállításakor letiltjuk az időzítőt.
A Windows-os alkalmazásban úgy járunk el, hogy az időzített műveletek bejegyzései egy új sorszámot kapnak kulcsnévként, mely tárolásra kerül a SoftwareOnline kulcs alatt. A szerviz csak végigmegy a bejegyzések kulcsain, majd az egyes alkulcsok Path, Minute és Hour nevű bejegyzéseinek értékeit kiolvasva elvégzi az ellenőrzést, és a pillanatnyi időponttal való egyezés esetén elindítja az alkalmazást a Process osztály Start metódusával.
Windows-os kliensalkalmazás
A SWinClient projektben induláskor ellenőrizzük, hogy a szerviz telepítve van-e, és ha igen, akkor elindítjuk. Ellenkező esetben a program hibaüzenettel leáll. Az indítást a ServiceController osztály Start metódusával végezzük el. A kód a következő:
ServiceController controller = new ServiceController("_TService");
... 
if (controller.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped))
{
  controller.Start();
  ...
Ehhez azonban telepítenünk kell a _TService nevű szervizünket. A Form felületén található KERES nyomógombbal kereshetünk egy indítandó .EXE alkalmazást, majd az idő óra- és perc összetevőjének megadása után az IDŐZÍTÉS gombbal helyezhetjük el a programot a ListView kontrolban, valamint a Rendszerleíró adatbázis megfelelő helyére.
Az elindított alkalmazás megtekinthető a Windows Feladatkezelőjében. A listából és az adatbázisból a TÖRLÉS gombbal törölhetjük az elhelyezett bejegyzést.