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 :

Mutlithreading pour l'utilisation simultanée de la même fonction


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut Mutlithreading pour l'utilisation simultanée de la même fonction
    Bonjour,

    Afin de tester les performances d'une procédure stockée (MS SQL 2008), je dois effectuer plusieurs appels simultanés, afin de voir le temps de réponse en fonction du nombre d'appel (ainsi que d'autres paramètres fournis au moment de l'appel).

    Pour cela j'ai pensé à du multithreading, cependant je ne sais pas comment faire pour pouvoir appeler plusieurs fois la même fonction...

    Ma fonction s'appelle GetPaths.
    Elle travaille sur deux paramètres (longitude, latitude), qui sont des attributs de la classe. La fonction randRange me permet d'obtenir des valeurs aléatoires de ces deux paramètres, pour pouvoir effectuer des appels différents...
    J'ai réalisé le code suivant, mais je me suis rendu compte que les appels ne sont pas simultanés, mais consécutifs...


    Code sql : 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
     
            public Form1()
            {
                InitializeComponent();
     
                Random r1 = new Random();
                Random r2 = new Random();
     
                int compteur = 0;
     
                while (compteur < 20)
                {
                    longitude = randRange(6.3810f, 6.3819f, r1);
                    latitude = randRange(43.7390f, 43.7399f, r2);
                    GetPaths();
                    compteur = compteur+1;
                }
             }

    Comment faire pour pouvoir effectuer les différents appels de GetPaths en même temps?

    A noter que la fonction GetPaths rempli un dataset qui permet de mettre à jour un gridview... Cela ne posera-t'il pas problème pour le multithreading?
    Je m'attend à une réponse positive de votre part à cette dernière question, dans ce cas comment l'éviter?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 326
    Points
    12 326
    Par défaut
    Il faut créer un thread à chaque itération de la boucle et le passage de paramètre peut se faire soit par fermeture soit par une classe dédiée.

    Ne jamais mettre du code non strictement nécessaire dans du code d'évaluation de monté en charge. Mettre à jour une grille est une tâche qui devrait être faite dans le thread créateur du formulaire via la méthode Invoke du formulaire, mais cela rendra vos calculs de performance totalement faux.

    Les threads de travaille devraient collecter les données, et le thread d'IHM affiche ces données.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Afin de lancer l'appel de la fonction à travers plusieurs Thread, Ci-dessous une solution :

    Si il y a des problèmes de synchronisation de ressource, il faudrait ajouter un locker dans la méthode DoWork car dans cette implémentation tous les threads qui sont lancés ont accès directement à la méthode sans attendre que l'un des thread finisse sont travail.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
     
    namespace Test.MultiThreadSql
    {
        class Program
        {
            static void Dowork()
            {
                GetPaths();
     
                // ajouter des chose s'il faut
            }
     
            static void Main(string[] args)
            {
     
                int nbThread = 20;
                List<Thread> threads = new List<Thread>();
     
                // Initialisation de la liste des threads
                for (int i = 0; i < nbThread; i++)
                {
                    // Si la méthode DoWork a besoin de paramètres
                    // Il faudra utiliser ParametrizedThreadStart à 
                    // la place de ThreadStart
                    threads.Add(new Thread(Dowork));
                }
     
                // Lancement des Thread
                foreach (Thread thread in threads)
                {
                    thread.Start();
                }
            }
        }
    }
    Cdlt,

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Ce qui serait plus clean ce serait de créer un vrai test et d'utiliser ça qui te permettra de gérer une pile de thread et leur exécution.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Merci link.fr, j'ai utilisé le code que tu proposais, cela fonctionne.

    Seul problème, dans ma fonction GetPaths(), j'ouvre une connection sql, puis ensuite avec un sqlDataAdaptater je rempli mon dataset, j'ai essayé de remplacer le sqlDataAdaptater par un sqlDataReader et de ne plus utiliser de dataset, mais j'ai toujours le même problème :

    Sur l'éxécution de ma commande, j'ai le message d'erreur suivant :
    Expiration du délai d'attente. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas.
    Comment faire?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    C'est bon j'ai contourné le problème en modifiant le timeout de ma commande. En le plaçant à 100ms, je n'ai plus de souci.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Effectivement,

    Ce type d'exception SQL vient la plupart des cas du timeout d'exection des requêtes.

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

Discussions similaires

  1. Problème pour utiliser trois tables en même temps
    Par drdoom21 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/04/2011, 09h32
  2. Utiliser plusieurs fois une même fonction
    Par ledisciple dans le forum Langage
    Réponses: 20
    Dernier message: 13/02/2010, 12h47
  3. Réponses: 2
    Dernier message: 31/05/2009, 19h28
  4. Réponses: 4
    Dernier message: 14/02/2008, 15h28
  5. Réponses: 4
    Dernier message: 07/03/2006, 15h54

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