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 :

mettre en place un timeout sur une instruction


Sujet :

C#

  1. #1
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut mettre en place un timeout sur une instruction
    Bonjour,

    dans mon programme, je fais appel à un webservice dont je n'ai pas la gestion... Et qui dit "web service" dit "potentiels problèmes de réseau lors d'un appel". Pour éviter de gaufrer mon programme alors qu'un seul appel ne passe pas suite à une micro coupure, je voudrais mettre en place un time out sur mon appel. Vers quelles fonctions / classes / méthodes m'orienteriez-vous ? (je ne demande pas du code tout fait, mais une piste)

    Merci de votre aide !

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Utilise un Thread pour appeler ton webservice. ça fera un truc genre
    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
     
    bool finished = false;
                bool success = false;
                Thread th = new Thread(new ThreadStart(delegate
                {
                    SummonZeWebService();
     
                    finished = true;
                    success = true;
                }));
                th.Start();
     
                DateTime start = DateTime.Now;
                while (!finished && DateTime.Now.Subtract(start).TotalSeconds < 60) /* 60 secondes */
                {
                    Thread.Sleep(10);
                }
                if (!finished)
                {
                    try
                    {
                        th.Abort();
                    }
                    catch { }
                    Failure();
                }
                else
                {
                      Victory();
                }

  3. #3
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    Merci de ta réponse...

    Par contre je ne connais pas bien le fonctionnement des threads... Le fait que je boucle pour faire plusieurs fois (> 300) appel au même webservice (avec des valeurs différentes) ne risque-t-il pas de poser un souci ? (je pense notamment au nombre d'instances de threads)

    Existe-t-il une autre solution sans thread ?

    Merci !

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Si ils sont appelés de manière successive en gros tu aura qu'un seul thread à la fois qui sera en train d'appeler le WebService donc pas de problème car chaque thread s'arrête lorsque le code qu'il "contient" se termine.
    S'ils sont appelés simultanément là ça devient autre chose et tu sera peut être contraint d'utiliser un ThreadPool (google t'en apprendra plus sur ce point).

  5. #5
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    Donc ça devrait bien se passer puisque cela va se présenter, en gros, de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i=0; i < nombre_max; i++){
     
       Le code que tu m as donné
     
    }
    Juste histoire que je sois sûr, tu ne vois pas de contre-indication à l'utilisation du thread ?

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Bah ça devrais aller. Mais tu devrais quand même regarder les histoires de ThreadPool, ça pourrai te servir par la suite, vu que question performances c'est toujours un peut lent de démarrer un nouveau thread.

  7. #7
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    OK, merci !!!
    Toute dernière précision par rapport au code que tu m'a donné pour voir si j'ai bien capté (et si je vais pas l'utiliser à mauvais escient) :
    -> dans delegate je mets les instructions qui seront exécutées dans le thread
    -> le while me permet d'attendre la fin de l'appel OU la fin du délai "autorisé" pour le traitement (10 secondes)

    mais à quoi sert le Thread.Sleep(10); ? et surtout pourquoi lui passer 10 alors que le délai "autorisé" est 60 secondes ?

    Merci de tes explications !

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par grinder59 Voir le message
    -> dans delegate je mets les instructions qui seront exécutées dans le thread
    oui

    Citation Envoyé par grinder59 Voir le message
    -> le while me permet d'attendre la fin de l'appel OU la fin du délai "autorisé" pour le traitement (10 secondes)
    Les deux à la fois

    Citation Envoyé par grinder59 Voir le message
    mais à quoi sert le Thread.Sleep(10); ? et surtout pourquoi lui passer 10 alors que le délai "autorisé" est 60 secondes ?
    En fait mon idée c'est que pour quelque chose orienté webservice tu as un truc genre une interface avec une message "Veuillez patienter". Pour ne pas bloquer l'interface et que l'utilisateur vois que ton application ne réponds pas, tu crées un autre thread (de la même manière) qu'on va appeler Joe et dedans tu y exécutes ton travail. Donc avec une variable globale tu vérifies grâce à un Timer que l'opération est terminée ou que le thread Joe se soit terminé et si oui tu dit à l'utilisateur que c'est terminé, sinon tu laisses le Veuillez patienter.

    Dans Joe maintenant il faudra faire les appels successifs à tes webservice. Il faudra donc créer d'autres threads à partir de Joe avec la boucle que tu as mentionné. Pendant ce temps cependant Joe doit attendre que les threads soit terminées et c'est à ça que servent les variables success et finished. Donc tant que l'appel au webservice n'est pas terminé (if(!finished)) il faut attendre ou abandonner (si ça dépasse 60 secondes, on Abort le sous thread). Ce qui correspond à ma boucle. Sauf que la construction
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(true)
    {
    }
    mange 100% du processeur. Donc il faut attendre gentiment avec le Thread.Sleep(10) qui ne correspond pas à 10 secondes mais à 10 millisecondes et dans ce cas l'utilisation du processeur redescend à ~0%.
    Une fois que l'attente est fini on peut donc passer au suivant, et quand Joe sera terminé, ton interface pourra être mise à jour avec le status de l'opération achevée.

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Précisons aussi que pour les webservices, Visual Studio génère le code d'un wrapper automatiquement (via "ajouter une référence web..." dans le menu contextuel de l'explorateur de solutions), et que pour chaque méthode getMachin proposée par le webservice, le wrapper a deux méthodes getMachin et getMachinAsync, cette dernière faisant exactement ce que tu veux.

    Et si t'es curieux, libre à toi de regarder le code généré pour savoir comme le bouzin est implémenté
    ಠ_ಠ

  10. #10
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Précisons aussi que pour les webservices, Visual Studio génère le code d'un wrapper automatiquement (via "ajouter une référence web..." dans le menu contextuel de l'explorateur de solutions), et que pour chaque méthode getMachin proposée par le webservice, le wrapper a deux méthodes getMachin et getMachinAsync, cette dernière faisant exactement ce que tu veux.
    Hé bah je savais pas, jamais eu l'occasion de tester les webservices

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par smyley Voir le message
    Bah ça devrais aller. Mais tu devrais quand même regarder les histoires de ThreadPool, ça pourrai te servir par la suite, vu que question performances c'est toujours un peut lent de démarrer un nouveau thread.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object o) { /*myCode*/ }));
    La méthode magique!

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/06/2013, 11h18
  2. [PHPUnit] Mettre en place les tests sur une solution existante
    Par UNi[FR] dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 16/05/2011, 12h21
  3. [AC-2000] Mettre en place un contrôle sur une table Access
    Par ceuce dans le forum VBA Access
    Réponses: 9
    Dernier message: 15/09/2010, 17h23
  4. Mettre en place des droits sur une vue différents de ceux de la table-source ?
    Par Antoun dans le forum Administration et Installation
    Réponses: 14
    Dernier message: 15/02/2010, 14h13
  5. [VBA-W]changer de place un numero sur une page word
    Par benco dans le forum VBA Word
    Réponses: 1
    Dernier message: 26/03/2006, 12h37

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