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 :

Soucis avec parallel.for


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    3e année bachelier info cours du soir et en formation Developpeur .net orienté sharepoint (Technifut
    Inscrit en
    Novembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : 3e année bachelier info cours du soir et en formation Developpeur .net orienté sharepoint (Technifut

    Informations forums :
    Inscription : Novembre 2011
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Soucis avec parallel.for
    Bonjour, voila j'essaie de remplir une liste dans une boucle parallel.for
    mais la liste ne se remplis que d'un élément.
    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
     
    AlloCineApi api = new AlloCineApi();
     
                List<Movie> test = new List<Movie>();
     
     
                Parallel.For(min, max, (int i) =>
                {
                    Movie movie = api.MovieGetInfo(i);
                    if (movie.Error == null)
                    {
                        test.Add(movie);
                    }
     
                });
     
     
                dataGridView1.DataSource = test;
    auriez-vous une petite idée ?

    merci ;-)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je suppose que vous voulez utiliser le parallélisme pour accélérer le temps de traitement... Seulement, on ne se lance pas dans du traitement en parallèle comme cela, il faut avoir des connaissances dans les algorithmes parallèles...

    Avec le parallélisme vient toutes les problématiques associées aux accès des ressources partagées. Il est normal que la liste se remplisse mal car la liste que vous utilisez n'est pas "Thread safe", autrement dit il faut faire extrêmement attention au partage de cette ressource. Faire un "Parallel.For" revient à lancer autant de threads que d'itérations dans la boucle. Cela amène alors à faire faire le "test.Add" de plusieurs threads en même temps.

    Il existe des techniques de synchronisation qui permettent d'empêcher plusieurs threads de faire le même code en même temps : les Mutex, et le lock par exemple.

    En supposant que votre api supporte l'accès en multithreadings, il faudrait alors faire quelque chose comme ceci :
    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
    AlloCineApi api = new AlloCineApi();
     
                List<Movie> test = new List<Movie>();
                object syncObject = new object();
     
                Parallel.For(min, max, (int i) =>
                {
                    Movie movie = api.MovieGetInfo(i);
                    if (movie.Error == null)
                    {
                        lock(syncObject)
                        {
                           test.Add(movie);
                        }
                    }
     
                });
     
     
                dataGridView1.DataSource = test;
    Ainsi, 2 threads ne vont pas entrer en collision pour l'ajout dans la liste.
    De plus, le Parallel.For renvoie quelque-chose... Il faudrait consulter le résultat du "Parallel.For" avant d'être sûr de pouvoir mettre la liste "test" comme datasource.

    Je vous invite à parcourir les liens que je vous ai donné concernant l'instruction lock et la classe Mutex, et tout ce qui est associé aux tâches et aux threads.

  3. #3
    Membre à l'essai
    Homme Profil pro
    3e année bachelier info cours du soir et en formation Developpeur .net orienté sharepoint (Technifut
    Inscrit en
    Novembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : 3e année bachelier info cours du soir et en formation Developpeur .net orienté sharepoint (Technifut

    Informations forums :
    Inscription : Novembre 2011
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Merci
    Bonjour, merci pour ces infos.
    En fait j'en ai déjà fait en formation mais j'ai oublié
    pas ma de chose à ce sujet.

    mais ce petit rappel vient bien à point.

    Merci ;-)

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Ph_Gr a visé en plein dans le mille, je voulais juste ajouter qu'il est aussi possible d'utiliser les collections thread-safe, qui gèrent elles-même les problématiques liées au multithreading.

Discussions similaires

  1. bug avec parallel.for
    Par shayw dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/03/2014, 12h00
  2. [Batch] Encore et toujours un soucis avec ce FOR ^^
    Par devilsnake88 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 27/01/2014, 20h57
  3. Quelques petits soucis avec ma boucle For
    Par CosaNostra dans le forum Langage
    Réponses: 10
    Dernier message: 12/06/2010, 21h55

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