Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Kuinka voi tallentaa laskut sulkeutuessaan?

Jaska [20.11.2018 21:38:44]

#

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?

groovyb [21.11.2018 01:28:43]

#

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);
            }

        });
    }

}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta