Miten C#:lla ja Linux Mintissä saa tehtyä ohjelman, joka laskisi tiettyä projektia aina koneen päällä ollessa?
Ensimmäisessä versiossani onnistuin tekemään ohjelmaan
do } } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
silmukan, jolla voin keskeyttää laskennan escillä, kun olen suorittanut ohjelmaa komentorivikehotteelta. Mutta entäpä jos haluaisin tehdä ohjelman, joka laskisi projektia vaikka kaksi kuukautta aina koneen ollessa päällä? Olisi kätevää laittaa tuollainen Mintin Session & Startup -kohtaan suorittamaan laskentaa.
Yksi tapa olisi tallentaa laskentaa vaikka puolen tunnin välein. Mutta saako C#:ssa otettua koodissa kiinni, että nyt käyttäjä haluaa sulkea kyseisen ohjelman Bashissa vaikkapa komennon pkill tai poweroff? Siispä tallennetaan laskenta ja suljetaan ohjelma. Vai pitääkö Bashin puolella tehdä skripti, joka ajaisi ohjelmaa ja suljettaessa lukisi jotenkin heksakoodeista mikä on tietyn muuttujan arvo ohjelmaa suljettaessa?
Nappaa kiinni SIGTERM signaaliin, jos haluat hallitusti sulkea ohjelmasi.
jos käytät .net corea, lyö handler kiinni AppDomain.CurrentDomain.ProcessExit -eventtiin.
AppDomain.CurrentDomain.ProcessExit += ExitHandler; void ExitHandler(object o, EventArgs args) { Console.WriteLine("Exiting..."); }
Jos käytät monoa, joudut tekemään vähän laajemman toteutuksen. Esim tämänsuuntaista sanoo stackoverflow
public interface IExitSignal { event EventHandler Exit; } public class UnixExitSignal : IExitSignal { public event EventHandler Exit; UnixSignal[] signals = new UnixSignal[]{ new UnixSignal(Mono.Unix.Native.Signum.SIGTERM), new UnixSignal(Mono.Unix.Native.Signum.SIGINT), new UnixSignal(Mono.Unix.Native.Signum.SIGUSR1) }; public UnixExitSignal() { Task.Factory.StartNew(() => { // blocking call to wait for any kill signal int index = UnixSignal.WaitAny(signals, -1); if (Exit != null) { Exit(null, EventArgs.Empty); } }); } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.