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 :

lancer un exception


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut lancer un exception
    Bonjour,

    voila mon pb, j'ai une ligne de code qui reste, d'une manière aléatoire, bloquée...on ne sait pas le pourquoi pr l'instant.
    pour débloquer la situation, y-a t il un moyen de dire au programme si l'exécution dure plus de 10 min alors lancer une exception ?

    Merci bcp!!

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    Ma foi, juste avant d'appeler la ligne qui bloque, il suffit de créer un thread qui attendra un waitevent. Si 10 mins s'écoulent, Thread.Abort est appelé, levant une exception sur le thread d'origine où se situe la ligne fautive.

    Code c# : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public sealed class Watchdog : IDisposable
    {
       private Thread _monitorThread;
       private Thread _threadToWatch;
       private EventWaitHandle _waitHandle;
     
       public Watchdog()
       {
          _threadToWatch = Thread.Current;
          _waitHandle = new ManualResetEvent(false);
          _monitorThread = new Thread(Run);
          _monitorThread.Background = true;
          _monitorThread.Start();
       }
     
       // Attend jusqu'à 10mins puis avorte threadToWatch si différent de null
       private void Run()
       {
           _waitHandle.WaitOne(10 * 60 * 1000, false);
     
          // Avortement du thread si cette instance n'a pas été disposée proprement
          // Copie locale de threadToWatch en cas de chgt de thread entre le test et abort
          var threadToAbort = _threadToWatch;
          if (threadToAbort != null) threadToAbort.Abort();
       }
     
       // Appelé quand tout s'est bien passé.
       public void Dispose()
       {
           // threadToWatch n'a pas bogué, pas besoin de l'avorter.
           _threadToWatch = null;
     
          // Réveil de monitorThread qui va se terminer en silence.
           _waitHandle.Set();
       }
    }

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using(new Watchdog())
    {
        DoSomeBuggyStuff();
    }

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    le mieux est de trouver pourquoi la ligne bloque et de corriger le bug
    pour ca il faut que tu nous donnes la ligne en question

    si c'est un thread séparé, tu peux en effet l'interrompre s'il dépasse plus de tant de temps, pour ca il faut au mieux être dans une boucle
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    Merci pour vos réponse...mais j'ai du mal à comprendre l'exemple de DonQuiche.

    est-ce qu'il ne suffit pas de faire un truc du genre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Thread rtThread = new Thread(new ThreadStart(Start));
                rtThread.Start();
                System.Threading.Thread.Sleep(10000);
               l'instruction en question
               rtThread.Join();
    merci

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Non, ça n'a pas du tout le même effet.

    Première remarque : ton "sleep" a seulement pour effet de faire dormir le thread d'origine (thread1) pendant 10s pendant que thread2 travaille (pour faire quoi ? Que contiendrait ce "start" ?) avant de lancer l'instruction boguée. En gros tu laisses 10s d'avance à thread2. Ça n'a aucun intérêt.

    Deuxièmement, tu dis à thread1 qu'une fois l'instruction boguée terminée (sans la forcer à se terminer), il faut ensuite attendre la fin de thread2. Là encore, tu n'accomplis rien de ce que tu voulais faire : notamment tu ne forces pas le thread d'origine à interrompre l'instruction boguée.

    Fondamentalement, il te faut un système qui, après 10s, avortera le thread d'origine si celui-ci ne s'est pas exécuté correctement. Si tout se passe bien, c'est la séquence "constructeur - début de run - dispose - fin de run" qui est exécutée. S'il y a un problème, c'est la séquence "constructeur - début de run - attente de 10mins - fin de run".


    Concernant mon code, avant toute chose sais-tu comment fonctionne le bloc "using" et "IDisposable" ? Que je sache quelle partie te pose problème.

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    ok merci, alors je vais me pencher un peu plus sur ton exemple...

Discussions similaires

  1. UserFunction lancer une exception?
    Par BenoitM dans le forum Développement
    Réponses: 2
    Dernier message: 23/04/2013, 10h19
  2. [PostgreSQL] Lancer un exception sur une requête échouée
    Par Nico87 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/07/2009, 16h05
  3. lancer une exception
    Par robert_trudel dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 25/08/2008, 21h15
  4. lancer les exceptions dans array
    Par zulad dans le forum C#
    Réponses: 8
    Dernier message: 17/07/2007, 16h22
  5. Lancer ses propres exceptions
    Par mister3957 dans le forum C++
    Réponses: 13
    Dernier message: 03/03/2007, 12h55

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