IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

StreamReader dans un thread empeche la fermeture de l'application


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut StreamReader dans un thread empeche la fermeture de l'application
    Bonjour à tous,

    Voila je rencontre un problème dans un programme en C#.
    J'ai un Thread qui tourne qui attend des messages depuis un NamedPipe, en client donc.
    Seulement si j'essaye de fermer mon application le thread continue de tourner jusqu'au prochain message avant de quitter.

    Code :
    Fonction qui lance l'écoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void EcouteNamedPipe()
    {
         mobjThreadTube = new Thread(tubeNotif.Ecoute);
         mobjThreadTube.Start();
    }
    Fonction qui arrête l'écoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void ArreteEcouteNamedPipe()
    {
         if (mobjThreadTube != null)
         {
              tubeNotif.Stoppe();       
         }
    }
    Classe tubeNotif:
    Fonction d'écoute tubeNotif.Ecoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public void Ecoute()
    {
         mobjPipeClient = new NamedPipeClientStream(".", msNomTube, PipeDirection.InOut);
         mobjPipeClient.Connect(2000);
         StreamWriter objFluxEcrit = new StreamWriter(mobjPipeClient);
         objFluxEcrit.AutoFlush = true;
         objFluxEcrit.WriteLine(mnIdConnectTube); // permet l'identification du client pour le serveur
     
         objFluxLu = new StreamReader(mobjPipeClient);
         mbEcoute = true;
         while (mbEcoute == true) // boucle jusqu'à un appel à tubeNotif.Stoppe
         {
              string output = objFluxLu.ReadLine(); // bloque ici tant qu'il n'y a pas de nouveau message
              MessageBox.Show(output);
         }
    }
    Fonction d'arrêt tubeNotif.Stoppe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void Stoppe()
    {
         mbEcoute = false;
         objFluxLu.Close();
         if (mobjPipeClient != null)
         {
              mobjPipeClient.Close(); 
         }
    }
    Seulement voila dans la fonction tubeNotif.Ecoute l'execution se bloque sur la ligne string output = objFluxLu.ReadLine(); tant qu'il n'y a pas de nouveau message. donc si j'appelle la fonction d'arrêt tubeNotif.Stoppe le thread reste actif.

    Si quelqu'un à rencontrer ce type de problème et a trouvé une solution merci de la partager. Je reste ouvert aux suggestions

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 97
    Par défaut
    Il y a trois solutions qui me viennent :
    - Tu laisses tomber le streamreader et tu lis de manière asynchrone avec mobjPipeClient.BeginRead (afin de ne pas bloquer ton thread)
    - Tu appelles Thread.Abort pour stopper net ton thread (ne fonctionnera peut être pas s'il est bloqué sur un appel non managé)
    - Ou un bon vieux Application.Exit(), ce n'est pas ce qu'il y a de plus élégant mais c'est efficace

    Petite parenthèse, WCF simplifie énormément l'utilisation des NamedPipes. Tu devrais y jeter un œil, si tu as possibilité de l'utiliser dans ton application.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut
    Merci KooKiz pour la réponse rapide.

    Citation Envoyé par KooKiz Voir le message
    [...]tu lis de manière asynchrone avec mobjPipeClient.BeginRead (afin de ne pas bloquer ton thread)
    J'ai eu quelque soucis avec le mode asynchrone mais je vais réessayer ça.

    Citation Envoyé par KooKiz Voir le message
    Tu appelles Thread.Abort pour stopper net ton thread...
    Pour ce qui est du thread.Abort j'ai déjà tester et le résultat est le même.

    Citation Envoyé par KooKiz Voir le message
    ... un bon vieux Application.Exit(), ce n'est pas ce qu'il y a de plus élégant mais c'est efficace
    Pour la solution "Application.Exit()" on va dire que j'aimerais m'en passer car il n'est pas à exclure que je pourrais avoir besoin d'arrêter l'écoute sans pour autant arrêter l'application.

    Citation Envoyé par KooKiz Voir le message
    Petite parenthèse, WCF simplifie énormément l'utilisation des NamedPipes. Tu devrais y jeter un œil, si tu as possibilité de l'utiliser dans ton application.
    Je vais également regarder de ce coté.

    Si vous avez d'autre idées... Merci d'avance

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Autre option : lance ton thread en background, comme ça il empêchera pas l'appli de se terminer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void EcouteNamedPipe()
    {
         mobjThreadTube = new Thread(tubeNotif.Ecoute);
         mobjThreadTube.IsBackground = true;
         mobjThreadTube.Start();
    }

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut
    Merci pour la réponse tomlev.
    Citation Envoyé par tomlev Voir le message
    Autre option : lance ton thread en background, comme ça il empêchera pas l'appli de se terminer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [...]mobjThreadTube.IsBackground = true;[...]
    Effectivement l'application se ferme correctement.
    Dans le cas ou je cherche juste à stopper l'écoute sans terminer l'application je ne suis pas sur que cela fonctionne cependant. Mais en faisant un mobjThreadTube.Suspend() cela fonctionne comme je veux.

    Reste à tester si tout ca ne pose pas de problème au niveau du serveur du pipe.

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fermeture socket dans un thread
    Par adrien1 dans le forum Débuter
    Réponses: 0
    Dernier message: 20/04/2010, 14h45
  2. [C#] Empecher la fermeture de l'application
    Par fab2050 dans le forum C#
    Réponses: 1
    Dernier message: 15/01/2009, 16h55
  3. [Process]Execution de process dans un thread
    Par devjava dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2004, 10h34
  4. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 09h20
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo