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 :

"Bizarrerie" méthode Parallèle


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 22
    Par défaut "Bizarrerie" méthode Parallèle
    Bonjour à tous,

    Résumé de la solution (pour couper le suspense) : Le problème si dessous, venait du fait que je tentais d'enregistrer un PDF de taille null, ce qui faisait freezer l'application.

    Voici mon problème :

    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Settings.Default.B_DevMod = true
    , ça marche.
    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Settings.Default.B_DevMod = false
    , la tâche ne se termine pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Parallel.Invoke(
        () => {
            XmlClasses.MaJPDFXml();
            if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Xml PDF à jour.");
            },
        () => {
            XAnalysePDF.GetTopIndice();
            if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Top indice définis.");
            });
    Idem, le code suivant marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Parallel.Invoke(
        () => {
            XmlClasses.MaJPDFXml();
            //if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Xml PDF à jour.");
            },
        () => {
            XAnalysePDF.GetTopIndice();
            //if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Top indice définis.");
            });
    Quelqu'un pourrait-il me dire pourquoi ça fait ça ?
    Est-je une solution ?

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Est-ce que ton dernier code (sans les conditionnelles), fonctionne également lorsque la propriété B_DevMod est définie à false ?
    Si non, c'est que les actions exécutées en parallèle sont influencées par tes paramètres par défaut et doivent donc y faire référence, directement ou indirectement.

  3. #3
    Membre averti
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 22
    Par défaut
    Bonjour,

    Oui oui, il marche avec B_DevMod à false.

    B_DevMod est un boolean qui est relié avec une checkbox (j'utilise le Settings.Default pour sauvegarder l'état à la réouverture de l'application).
    S'il est à true : j'écris un log complet.
    S'il est à false : je n'écris qu'un log partiel.
    Je ne l'utilise donc que devant WriteInLog.Add2log("...");

    Ce qui est difficile à comprendre, c'est que ça marche dans d'autres Parallel.Invoke de la même classe, du moment que la "branche" possède au moins 2 instructions :

    Marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Parallel.Invoke(
        () => {
            XmlClasses.MaJPDFXml();
            if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Xml PDF à jour.");
            XAnalysePDF.GetTopIndice();
            },
        () => {
            XAnalysePDF.GetTopIndice();
            if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Top indice définis.");
            XmlClasses.MaJPDFXml();
            });
    Ne marche pas si Settings.Default.B_DevMod est à false :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Parallel.Invoke(
        () => {
            XmlClasses.MaJPDFXml();
            if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Xml PDF à jour.");
            },
        () => {
            XAnalysePDF.GetTopIndice();
            if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Top indice définis.");
            });
    J'ai l'impression que s'il y a qu'une seule instruction entre les "{}" a exécuter, sa plante...

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par jaune74 Voir le message
    J'ai l'impression que s'il y a qu'une seule instruction entre les "{}" a exécuter, sa plante...
    Ce n'est pas impossible, mais reste très très peu probable. Il y a plus de probabilité que ce soit les tâches lancées qui se bloquent pour une raison ou une autre.

    En mode debug, si lorsque ton application gèle, tu la mets en pause et que tu observes les différents threads pour savoir où ils sont arrêtés, qu'obtiens-tu ?

  5. #5
    Membre averti
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 22
    Par défaut
    Bonjour,

    La partie du code qui pose problème est lancé en parallèle de .

    Je lance l'application, j'attends quelques secondes, et je fais pause : le résultat est identique entre et : une seule thread "visible" qui est sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Run(new WF_MainForm());
    ...

    Pourtant, dans un cas ça marche, et dans l'autre non ... : j'ai utilisé des Sémaphores pour empêcher l'application de se fermer avant que les fonctions critiques ne soient terminées, résultat l'application ne se ferme pas...

    Je m'explique :
    Avant de lancer l'initialisation, je prend 1 jeton du sémaphore, et une fois l'initialisation terminée, je rends le jetons.
    A la fin de l'application, je compte les jetons et je ferme.

    Le jetons est pris en amont de tous ces "Paralell" et est rendu à la fin de tous cela : en aucun cas je ne manipule de jetons dans la partie incriminée.

  6. #6
    Membre averti
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 22
    Par défaut
    Je viens d'effectuer un autre test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Parallel.Invoke(
        () => {
           XmlClasses.MaJPDFXml();
           if (Settings.Default.B_DevMod)
               WriteInLog.Add2log("Xml PDF à jour.");
           bool i = Settings.Default.B_DevMod;
           },
       () => {
           XAnalysePDF.GetTopIndice();
           if (Settings.Default.B_DevMod)
                WriteInLog.Add2log("Top indice définis.");
           bool i = Settings.Default.B_DevMod;
        });
    Et cela marche à tous les coup : que B_DevMod soit à true ou false ...

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

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