11
votes

Comment appeler événement avant environnement.exit ()?

J'ai une application de console en C #. Si quelque chose ne va pas, j'appelle environnement.exit () pour fermer mon application. J'ai besoin de se déconnecter du serveur et de fermer certains fichiers avant la fin de l'application.

En Java, je peux implémenter un crochet d'arrêt et l'enregistrer via runtime.getruntime (). addshutdownhook () . Comment puis-je obtenir la même chose en C #?


0 commentaires

3 Réponses :


-2
votes

Je recommanderais d'envelopper l'appel à l'environnement.exit () dans votre propre méthode et en utilisant cela. Quelque chose comme ceci: xxx


4 commentaires

-1: Cela augmente considérablement le couplage lorsqu'il existe d'autres façons easy de faire fonctionner les choses sans ceci: EN.Wikipedia.org/wiki/Coupling_ (Computer_Science)


Comment cela augmenterait-il le couplage? La question pose la question de savoir comment aborder cela dans une demande de console, alors appeler environnement.exit serait une action valide. L'utilisation des événements serait plus facile, mais ils vont à l'encontre de l'AppDomain, et non du processus.


Si vous devez faire un nettoyage pour la ressource A quand il est fait être utilisé, gardez le nettoyage local pour A. Ne pas besoin de A, B, C et D pour y faire des hébergements spéciaux.


Un cas où cela peut ne pas faire la coupe est en cas d'exceptions non adaptées pouvant conduire à une sortie d'application, auquel cas myexit ne sera pas appelé. Toujours une réponse valide. Ne pense pas que cela mérite un bowvote



28
votes

Vous pouvez joindre un gestionnaire d'événements à l'événement ProcessExit de l'application actuel:

using System;
class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.ProcessExit += (s, e) => Console.WriteLine("Process exiting");
        Environment.Exit(0);
    }
}


0 commentaires

12
votes

Hook AppDomain Événements:

private static void Main(string[] args)
{
    var domain = AppDomain.CurrentDomain;
    domain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
    domain.ProcessExit += new EventHandler(domain_ProcessExit);
    domain.DomainUnload += new EventHandler(domain_DomainUnload);
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
    Exception e = (Exception)args.ExceptionObject;
    Console.WriteLine("MyHandler caught: " + e.Message);
}

static void domain_ProcessExit(object sender, EventArgs e)
{
}
static void domain_DomainUnload(object sender, EventArgs e)
{
}


0 commentaires