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 :

Création et gestion d'un timeout


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Par défaut Création et gestion d'un timeout
    Bonjour,

    J'espère que vous pourrez m'aider car je galère vraiment sur un problème de time out. Voilà, j'ai une application WinForm dans laquelle s'exécute un BackGroundWorker :

    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
    17
    18
    19
    20
    21
     
    private void ImportExportFlareInBGW(ExpFlare expFlare, BackgroundWorker worker, DoWorkEventArgs e)
            {
     
                try
                {
                     fonction1();
                     fonction2();
                     fonction3();
                }
                catch (Exception ex)
                {
                    // Sauvegarde l'erreur dans un log
                }
                finally
                {
     
                    // Gestion des logs : écritures des résultats
                }
     
            }
    Mon BackGroundWorker fonctionne parfaitement. Seulement voilà, on m'a imposé de mettre en place un timeout. Si le traitement du BackgroundWorker n'est pas fini au bout de 10 min, je dois arréter le traitement, mais je dois quand meme passer par le bloc Finally.

    J'ai donc créé un timer, qui au bout de 10 min, déclenche une exception "TimeOut".

    Seulement, je vois pas comment récupérer cette exception dans mon BackGroundWorker ... je ne sais même pas si c'est la bonne solution à employer.

    Donc je voudrais savoir si vous aviez des idées pour régler mon problème. J'ai réussi à arréter le backgroundWorker au bout de 10 min, mais en le stoppant complétement. Et donc je ne passe pas par le bloc Finally ...

    Si quelqu'un pouvait m'éclairer ... merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    salut,

    tu déclares une variable visible partout du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool StopMonBackGround = false;
    quand ton évènement TimeOut est déclenché, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StopMonBackGround = true;
    et tu fais des tests dans tes différentes fonctions du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (StopMonBackGround)
    break; //ou Return; ou plein d'autres choses

  3. #3
    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
    Pourquoi déclencher une exception ? Il y a déjà un mécanisme prévu pour interrompre le traitement d'un BackgroundWorker :

    - D'abord, assure-toi que la propriété WorkerSupportsCancellation est à true
    - Pour interrompre le traitement, appelle la méthode CancelAsync du BGW
    - Dans le DoWork, ton traitement doit régulièrement vérifier la propriété CancellationPending du BGW, pour savoir si l'annulation a été demandée. Quand CancellationPending vaut true, tu sors de ta boucle de traitement, et tu mets à true la propriété Cancelled de l'évènement

  4. #4
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Par défaut
    J'ai regardé pour le cancelAsync. Le problème, c'est que ça annule complément le backgroundWorker, et donc ça ne passe pas par la méthode RunWorkerCompleted ...

    Il va donc falloir que je recopie le code qui était présent dans RunWorkerCompleted pour mettre à jour mon IHM si jamais j'annule le traitement. J'aurais voulu éviter ça mais apparement y'a pas d'autre solution

    Merci à vous

  5. #5
    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
    Citation Envoyé par Jitoubi Voir le message
    J'ai regardé pour le cancelAsync. Le problème, c'est que ça annule complément le backgroundWorker, et donc ça ne passe pas par la méthode RunWorkerCompleted ...
    Euh... ça, ça m'étonnerait ! je viens de refaire le test, le RunWorkerCompleted est bien appelé. Tu as du faire quelque chose de travers...

    Citation Envoyé par Jitoubi Voir le message
    Il va donc falloir que je recopie le code qui était présent dans RunWorkerCompleted pour mettre à jour mon IHM si jamais j'annule le traitement. J'aurais voulu éviter ça mais apparement y'a pas d'autre solution
    Ben il suffit de l'extraire dans une méthode, que tu peux appeler aux 2 endroits...

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

Discussions similaires

  1. [Stratégie] Gestion d'un timeout en environnement mono-thread
    Par loicdvi dans le forum Général Java
    Réponses: 2
    Dernier message: 14/05/2007, 09h07
  2. Création et gestion de checkbox en dynamique
    Par davinout dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 15/01/2007, 15h47
  3. Création programme gestion
    Par Klaad dans le forum Windows
    Réponses: 4
    Dernier message: 19/10/2006, 19h54
  4. Réponses: 3
    Dernier message: 24/02/2006, 13h27
  5. Création et gestion d'un curseur en PL/SQL
    Par Petit_Jardin dans le forum PL/SQL
    Réponses: 2
    Dernier message: 23/11/2005, 14h27

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