none
Parallélisme et collection

Réponses

  • Bonjour,

    oui, pour ce faire vous devez ajouter un verrou pour assurer que seul un seul thread puisse réaliser l'opération. Par exemple la méthode Add n'est pas thread-safe du coup l'ajout d'un verrou garantit qu'il n'y ai aucun interférence entre les différent thread :

    List<string> provider = new List<string>()
                {
                    "Premier élément",
                    "Deuxième élément",
                    "Dernier élément"
                };
    
                List<string> results = new List<string>();
    
                object verrou = new object();
    
                Parallel.ForEach(provider, current =>
                {
                    lock (verrou)
                    {
                        results.Add(current);
                    }
                });

    Cordialement,

    mardi 26 juillet 2016 16:51
  • Bonjour,

    Vous pouvez utiliser le verrou comme le dit Arthur, ou l'une des classes collection qui sont threadSafe dans System.Collections.Concurrent comme ConccurentDictionary


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    jeudi 28 juillet 2016 12:37

Toutes les réponses

  • Bonjour,

    oui, pour ce faire vous devez ajouter un verrou pour assurer que seul un seul thread puisse réaliser l'opération. Par exemple la méthode Add n'est pas thread-safe du coup l'ajout d'un verrou garantit qu'il n'y ai aucun interférence entre les différent thread :

    List<string> provider = new List<string>()
                {
                    "Premier élément",
                    "Deuxième élément",
                    "Dernier élément"
                };
    
                List<string> results = new List<string>();
    
                object verrou = new object();
    
                Parallel.ForEach(provider, current =>
                {
                    lock (verrou)
                    {
                        results.Add(current);
                    }
                });

    Cordialement,

    mardi 26 juillet 2016 16:51
  • Bonjour,

    Vous pouvez utiliser le verrou comme le dit Arthur, ou l'une des classes collection qui sont threadSafe dans System.Collections.Concurrent comme ConccurentDictionary


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    jeudi 28 juillet 2016 12:37
  • en VB cela donne quoi?


    BP14

    vendredi 5 août 2016 07:12
  • En utilisant un convertisseur :

    Dim provider As New List(Of String)
    
    provider.AddRange(New String() { _
    	"Premier élément", _
    	"Deuxième élément", _
    	"Dernier élément" _
    })
    
    Dim results As New List(Of String)()
    
    Dim verrou As New Object()
    
    Parallel.ForEach(provider, Function(current) 
    SyncLock verrou
    	results.Add(current)
    End SyncLock
    

    Cordialement,

    vendredi 5 août 2016 08:07