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 :

Traitement lancé dans un thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Traitement lancé dans un thread
    Bonjour !

    J'aurai besoin des lumières de quelqu'un qui s'y connait mieux que moi en Thread (ce qui n'est pas dur).

    Voici le contexte : Nous sommes dans une application web où un utilisateur upload un fichier qui va être traité. Ce traitement pouvant être long, je l'ai lancé dans un nouveau thread pour ensuite rediriger l'utilisateur vers une page de suivi. (Sur cette page, je lis périodiquement des informations écrites par le Thread dans la Session.)

    Tout fonctionne bien. Le problème qui se pose c'est qu'on a pas de visibilité sur le Thread. Si je veux le forcer à s'interrompre ? Par exemple parce qu'il serait resté bloqué pour une raison X ou Y. Y a-t-il un moyen d'enregistrer une référence (un ID unique ?) permettant de retrouver mon thread et son état et éventuellement de le tuer "proprement" ?

    En vous remerciant d'avance !
    Laewella

  2. #2
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Hello,
    Comment est créé le thread en question?
    La méthode classique, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Thread monThread = new Thread(maMethode);
    et donc la variable monThread permet d’accéder à toutes les infos du thread créé.

    Pour contre, pour ce qui est de tuer le thread proprement, la méthode généralement recommandée est que le thread interroge régulièrement un flag qui lui permet de savoir s'il doit s'interrompre ou pas (ne pas utiliser monThread.Abort(), par exemple, ce n'est pas fiable du tout)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le Thread est bien créé à peu près de cette façon. Sauf qu'après ça, j'ai un this.Respose.Redirect, pour amener l'utilisateur à sa page de suivi (sur laquelle il n'est pas obligé de rester d'ailleurs, il peut même fermer son navigateur et quitter donc complètement l'application). Donc je ne conserve pas ma variable.

    Pour ce qui est du "proprement", en fait, c'est plutôt "être sure que le thread ne tourne plus" (soit parce qu'il s'est arrêté tout seul, soit parce que je le force à s'arrêter). Ceci serait fait grâce à une action utilisateur qui servirait en gros à interrompre les traitements qui prennent vraiment trop de temps. Mais pour ça, il me faut un moyen de retrouver mon Thread...

  4. #4
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Hello,
    Ne connaissant pas les détails de ton application, je ne peux qu'émettre une suggestion. L'idée serait de stocker tes variables de type Thread dans un objet de ton application.
    Par exemple, si chaque utilisateur est modélisé par une classe, tu pourrais ajouter à cette classe une liste des threads démarrés par cet utilisateur.
    Où alors, tu pourrais créer une grosse liste qui associe les fichiers en cours d'upload avec le Thread qui lui est dédié.
    L'idée générale étant de stocker cette référence à l'objet Thread dans un autre objet qui, lui, est accessible même après la redirection.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Hello !

    Merci pour ta réponse ! Effectivement, j'aurai dû penser à quelque chose comme ça : stocker la référence de l'objet tout simplement. J'étais partie plutôt sur une idée que j'aurai un truc du genre GetThread(...) qui prendrais un ID et me retournerait le thread, mais c'est bien plus simple de stocker direct la référence (qui est encore valide après la fin du thread non ? Alors qu'un ID, si j'ai bien compris peut être réutilisé pour un autre Thread)

    L'idée c'est qu'un Administrateur puisse lister les Thread qui tourneraient depuis trop longtemps pour les arrêter. Donc la liste globale, c'est parfait ! Je vais voir ce que ça donne.

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Re-bonjour,

    Toujours dans le même contexte, j'ai un autre souci...
    Lorsque je crée mon thread de traitement du fichier, je lui donne l'objet HttpSessionState de la page pour qu'il puisse y inscrire des choses. Ainsi, la page de suivi (qui s'actualise périodiquement en partie grâce à un UpdatePanel) peut lire ces données dans la session et les utiliser pour afficher l'état d'avancement.

    Mon problème c'est qu'hier, tout fonctionnait très bien. Depuis, j'ai fait pas mal de modifications et ce mécanisme ne fonctionne plus du tout : c'est comme si la session mise à jour par le thread et celle lu par la page de suivi n'était pas la même (pourtant le SessionID de l'objet est bien le même dans les deux cas (vérifié en debug exécution pas à pas)).

    J'avoue ne plus savoir exactement tout ce que j'ai modifié, et du coup, je ne sais plus quoi faire pour revenir à l'état précédent où la communication passait...
    Voici la configuration du web.config pour la session : <sessionState mode="InProc" cookieless="false" timeout="20" />

    Quelqu'un a une idée ? (Même si c'est pour me dire que ce que j'ai fait n'est pas la bonne méthode et m'en proposer une autre ^^)

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

Discussions similaires

  1. Architecture de mon algorithme: quand séparer un traitement dans un thread ?
    Par billybobbonnet dans le forum Windows Presentation Foundation
    Réponses: 42
    Dernier message: 17/10/2014, 14h59
  2. [WD14] RepriseSaisie() (traitement lancé d'un Thread)
    Par nuFox dans le forum WinDev
    Réponses: 6
    Dernier message: 14/10/2011, 14h03
  3. Label dans une fenêtre lancée par un thread qui ne s'affiche pas !
    Par totojava dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 23/01/2011, 15h07
  4. Executer le traitement dans un thread ou BackgroundWorker
    Par skunkies dans le forum Windows Forms
    Réponses: 13
    Dernier message: 28/05/2009, 23h41
  5. Réponses: 1
    Dernier message: 24/02/2007, 14h02

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