Question

J'ai une application qui fait une tâche de fond (réseau d'écoute et lecture) dans une Thread séparée. Il semble toutefois que la discussion ne soit pas résiliés / Aborted quand je ferme l'application (cliquez sur le bouton « x » sur la barre de titre). Est-ce parce que la routine principale de cette discussion est while(true) {...}? Quelle est la solution ici? Je cherchais un certain drapeau « interruption » du fil comme condition de boucle « while », mais n'a pas trouvé.

Était-ce utile?

La solution

La façon la plus simple est de définir le IsBackground propriété du fil à true. Cela empêchera de maintenir l'ouverture de l'application. Une application se termine lorsque tous les fils de non-fond se terminent.

Une façon plus contrôlée pour arrêter le fil est d'envoyer un message à fermer proprement et veiller à ce qu'il a mis fin avant de laisser votre fil conducteur fin.

Une méthode que je ne recommanderais pas est d'appeler Thread.Abort . Cela a un certain nombre de problèmes, dont l'un est qu'il ne soit pas garanti de mettre fin au fil. De la documentation:

  

L'appel de cette méthode habituellement arrête le thread.

Non souligné.

Autres conseils

Vous pouvez toujours forcer la question:

class Program
{
    public static void Main()
    {
        // ... do stuff
        Environment.Exit(Environment.ExitCode);
    }
}

La meilleure approche est de définir la propriété Thread.IsBackground true comme Mark a déjà été mentionné.

Vous pourrait améliorer la boucle while (true) à

void DoWork() {
    while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
      // do something
    }
    IDidQuitManualResetEvent.Set()
}

Un peu plus gracieux, court à partir des noms d'identification.

Eh bien, au lieu de while(true), peut-être vous devriez:

while(appIsRunning)
{
}

Et, lors de l'événement de clôture de votre formulaire,

appIsRunning = false;
thread.Join(2000);

où la dernière ligne est juste pour vous assurer que vous attendez le fil à la fin proprement. Il y a beaucoup d'autres façons de forcer un terme à un fil, mais le problème est juste là. Vous ne voulez pas être forcer les choses, vous voulez qu'ils se produisent aussi naturellement que possible

Après la jonction, vous pouvez vérifier l'état de fil pour voir si elle a fini. Si elle ne le fait pas, puis (et alors seulement) la force de son arrivée avec arrêt prématuré, et peut-être informer votre utilisateur (ou écrire un enregistrement du journal) que quelque chose n'a pas terminé comme il le devrait.

Vous pouvez commencer votre fil comme:

ThreadPool.QueueUserWorkItem(DoStuff, input)

Et il sera automatiquement annulé avec près d'application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top