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 :

Best practice démarrage multi-Thread depuis une boucle


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 31
    Points : 24
    Points
    24
    Par défaut Best practice démarrage multi-Thread depuis une boucle
    Bonjour,

    Je me permet de vous solliciter pour une question concernant le démarrage de plusieur Thread en fonction d'une lecture de base de donnée.

    Je m'explique.

    J'ai dans un programme une table contenant des informations de connexion utilisateur à un serveur mail. "Addresse du serveur, login, mot de passe " etc.

    J'ai une méthode contenant une boucle infini permettant de ce connecter et de récupérer les mails de l'utilisateur afin de gérer les BAL des users.

    J'ai une autre méthode permettant de lire dans la base de donnée les informations des différents compte utilisateur paramétré.


    Aujourd’hui je procède comme suit mais j'ai peur que le démarrage d'un delegate thread comme ci dessous pose problème pour un grand nombre de compte : Pouvez-vous me faire vos retours sur ce genre de besoin. merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(reader.read){
    string ... = reader[0].toString();
    string ... = reader[1].toString();
    // je recupere les infos des comptes de BDD
     
    new Thread(delegate(){connectMailBox(string param1, string param 2});
    Sachant que la méthode connectMailBox est une boucle While(true)

    Merci de votre aide

    Cdt

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Je suis deg j'avais répondu à ton post et je me rend compte que la réponse n'est pas partie....
    Donc je recommence :

    Le choix dépend vraiment de ce que tu veux faire.
    • Pourquoi ne pas faire le traitement en série dans le même thread que celui qui utilise le reader ?
    • Le traitement qui est effectué dans "ConnectToMailBox" est-il long ? Et si oui est-il plus long que l'allocation d'un thread ? As tu vérifié ? Quel est le bug de paralléliser ces connexions ?
    • Peut-être creuser du coté de l'asynchrone ? des Task; plus légères que les Thread.


    Tiens nous au courant.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    1 - Pourquoi faire du multithread? Les gains POTENTIELS de performance sont rarement une justification pour la complexité ajoutée.
    2 - Si tu y tiens tellement et que tu développes en .net 4.0+, il faudrait regarder le parallèlisme.
    3 - Ce ne sont pas tous les serveurs de email, ni toutes les versions, qui vont travailler de façon asynchrone. Un serveur Domino va traiter toutes les requêtes de la même addresse ip de façon synchronique, ce qui rend inutile et même contreproductive une approche asynchrone du côté client.

    Mon avis: si quelqu'un ne sait pas quand et comment faire du multithreading, il ne devrait l'éviter et se concentrer sur d'autres aspects d'optimisation.

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

    Quelques pistes...

    a) Tu pourrais recycler les threads, par exemple en conservant un bassin de threads. Ou utiliser ThreadPool (éventuellement via Task.Run) mais une connexion IP est un peu lente et pourrait quelque peu gêner le bon fonctionnement de ThreadPool à l'avenir.

    b) Les OS ont un mécanisme spécifique pour ton besoin : les IO completion ports, qui permettent d'attendre une opération IO sans avoir besoin de créer un thread dédié. Sous dotnet le couple TcpClient + TcpListener utilisent en sous-main les completion ports si je ne m'abuse.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    BabyNeedle: 1 - Pourquoi faire du multithread? Les gains POTENTIELS de performance sont rarement une justification pour la complexité ajoutée.
    ...
    Mon avis: si quelqu'un ne sait pas quand et comment faire du multithreading, il ne devrait l'éviter et se concentrer sur d'autres aspects d'optimisation.
    100% d'accord : scruter les boites mails dans un event Timer géré dans la forme principale de l'application devrait convenir.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par Babyneedle Voir le message
    1 - Pourquoi faire du multithread? Les gains POTENTIELS de performance sont rarement une justification pour la complexité ajoutée.
    (...)
    Mon avis: si quelqu'un ne sait pas quand et comment faire du multithreading, il ne devrait l'éviter et se concentrer sur d'autres aspects d'optimisation.
    Citation Envoyé par Graffito Voir le message
    100% d'accord : scruter les boites mails dans un event Timer géré dans la forme principale de l'application devrait convenir.
    Qu'en savez-vous ? Ce ne sont que des spéculations qui ne répondent pas à la question. Et par ailleurs il ait très bien quand et comment faire du multitâches, ce n'était pas le sens de sa question.

    Que vous lui posiez la question au cas où ce serait un débutant qui se fourvoie, très bien. Mais ne vous montrez pas catégoriques sans savoir.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Qu'en savez-vous ? Ce ne sont que des spéculations qui ne répondent pas à la question. Et par ailleurs il ait très bien quand et comment faire du multitâches, ce n'était pas le sens de sa question.

    Que vous lui posiez la question au cas où ce serait un débutant qui se fourvoie, très bien. Mais ne vous montrez pas catégoriques sans savoir.
    Ce que j'en sais vient de mon expérience. Ça fait 8 ans maintenant que je gère des développeurs et chaque fois qu'on m'a présenté la problématique, souvent après les faits, la personne a péché par excès d'optimisation prématurée.

    Au moins 95% des optimisations que je dois faire pour sauver des applications sont faites au niveau du Data Access Layer ou de la DB. Faire du multithreading peut rapidement devenir un cauchemar pour celles et ceux qui doivent faire le ménage derrière les petits agités.

    En février dernier j'ai dû refaire à 80% un programme C++ qu'un petit génie a décidé d'écrire pour automatiser des envois de fax. Le programme était tellement optimisé qu'il faisait exploser le vieux serveur de fax. Bravo mon champion!

    Alors, non, il ne sait pas 'très bien quand et comment faire du multitâche' car il aurait d'abord considéré la capacité du serveur de mail à recevoir des requêtes en parallèle.

    Développe ton application, mesure ta performance. Si après avoir appliqué toutes les bonnes pratiques et que la performance n'est toujours pas acceptable, alors et seulement alors, on peut explorer des méthodes plus avancées tel que le multithreading.

Discussions similaires

  1. Cumuler des variables depuis une boucle
    Par mac7474 dans le forum Langage
    Réponses: 19
    Dernier message: 03/08/2009, 10h51
  2. Passer un paramètre dans Include, depuis une boucle
    Par Xandar dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/05/2009, 10h36
  3. MySQL : Best Practice : Nombre de champ dans une table
    Par Ziquet dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/05/2008, 16h18
  4. esque un thread stop une boucle infinie?
    Par aefmaaradji84 dans le forum C++/CLI
    Réponses: 5
    Dernier message: 18/07/2007, 09h42
  5. Réponses: 15
    Dernier message: 07/07/2005, 11h05

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