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

Windows Forms Discussion :

Comment utiliser un TimeOut dans un while ?


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Comment utiliser un TimeOut dans un while ?
    Bonjour à tous ! Tout d'abord bravo pour ce fabuleux forum (une véritable mine de connaissance !)

    J'ai créé une application windowsform (je vais pas aller dans le détail de son fonctionnement) à un moment je charge un fichier xml qu'une autre application me transfert dans un dossier, j'ai un thread qui scrute ce dossier et dés qu'il trouve un fichier xml il le lance une méthode privée XmlReadFile qui lit le xml (elle ne le lit pas vraiment, je charge le xml dans un DocumentXml et je récupère les infos du xml)
    Alors de temps à autre j'avais une exception comme quoi le xml était déjà en cours d'utilisation par un autre processus (l'autre application n'a surement pas le temps de libérer le xml que le thread met la main dessus ) donc j'ai modifié mon code maintenant dans la méthode privée avant de charger le document xml j'ai un while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!TryExclusiveOpen(this._valRegistryDictaCom.GetValue("XmlNumber").ToString(), out fs))
    {
       //instruction
     
    }
    Ce while appelle une méthode privée qui me renvoie un booléen et cette méthode regarde si le xml est libre :
    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
     
    private bool TryExclusiveOpen(string filePath, out FileStream fs)
            {
                try
                {
                    fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None);
                    fs.Close();
                    return true;
                }
                catch
                {
                    fs = null;
                    return false;
                }
            }
    Mon soucis étant que si le fichier n'est jamais liberé ma boucle while sera sans fin comment mettre un TimeOut dans cette première boucle while ? Je vois pas trop comment on fait ... J'aimerai que dans ma première boucle si jamais le fichier au bout de 10 secondes n'est toujours pas libre qu'on affiche un MessageBox.

    Merci de votre aide et si je n'ai pas été clair n'hésitez pas à me demander des précisions

  2. #2
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Je pense que ton exception vient du paramètre FileShare lorsque tu ouvres le fichier.

    Essayer de remplace FileShare.None par FileShare.Read

    Du coup, plus besoin de TimeOut
    Il y a toujours au moins deux solutions à un problème.

    http://software-design-development.blogspot.com/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Je te remercie pour cette réponse (rapide en plus !) je test et je te tiens au courant ^^

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    mets les quote [CODE] [/ CODE] (sans espace) pour que ca doit plus jolie pour le code ^^

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Désolé mais l'exception ne vient pas de là en effet je suis persuadé que celà vient d'un conflit entre les deux applications car quand je dépose à la main le fichier xml je n'ai jamais cette exception ! (je vous rappelle il y a deux exe, un qui génère un xml et qui le dépose dans un dossier prédéfini et l'autre qui scrute le dossier et qui charge le xml)
    Au départ j'avais tout le temps cette exception j'ai augmenté le sleep de mon thread à 500 milli secondes et maintenant l'erreur arrive une fois sur trois environs...
    Donc j'ai mis en place mon while avec ma méthode privée qui me retourne un booléen selon si le xml est libre ou pas. Comme ça plus de soucis or si le xml n'est pas liberé (ya pas de raison mais bon faut toujours penser au pire ) j'ai une boucle infinie...

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Au lieu de bricoler dans l'application qui doit charger le contenu du fichier, tu devrais analyser l'application qui crée le fichier et voir si elle ne pourrait pas le libérer plus tôt (appel de la méthode Dispose() sur le TextWritter ou XmlWritter)

    Tu peux utiliser des outils comme ProcessExplorer ou FileMon de SysInternals pour voir précisément ce qui se passe.
    Il y a toujours au moins deux solutions à un problème.

    http://software-design-development.blogspot.com/

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    J'y avais pensé mais si je m'embête comme ça c'est que je n'ai pas le choix, en effet l'autre application est développé par un autre programmeur et je n'ai pas ces sources et aucun moyen de le contacter pour le moment... Ce n'est donc pas possible de mettre un TimeOut sur le while ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Points : 299
    Points
    299
    Par défaut
    Pourquoi ne met tu pas un second timer qui te fais sortir de ton while avec une valeur nombre de tentative .
    Comme ca tu exectues au maximum un certain nb de fois ta boucle while.
    Le nb de tentative dans le fichier de config comme ca t'es tranquille.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Hum ouaip je vais faire comme ça merci bien

Discussions similaires

  1. Comment utiliser le ping dans un prog
    Par debutant-1 dans le forum Linux
    Réponses: 2
    Dernier message: 23/06/2006, 10h09
  2. Réponses: 4
    Dernier message: 16/02/2006, 16h28
  3. Réponses: 1
    Dernier message: 09/02/2006, 16h59
  4. Réponses: 7
    Dernier message: 25/11/2005, 17h11
  5. [C#]Comment utiliser un dataset dans plusieurs...
    Par Sonny dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/11/2005, 14h03

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