none
Enumération de collection et Sécurité des Threads RRS feed

  • Question

  • Bonjour,

    J'ai créé une classe simple avec deux propriété de type valeur (MaChaine et MonInt), disons "maClasse".
    J'ai ensuite créé une seconde classe (maCollection) qui hérite de ReadOnlyCollection(Of maClasse).

    Cette collection expose une méthode publique qui génére un nombre et parcourre la collection :

     Public Function GetChaine() As String
    
     Dim rdGen As New Random
     Dim tirage As Integer
    
     tirage = CByte(rdGen.Next(1, 101))
     For I As Integer = 0 To Me.Count - 1
    
     tirage -= Me.Item(I).Ratio
     If tirage <= 0 Then Return Me.Item(I).MaChaine
    Next Return String.Empty End Function
    Je souhaiterais savoir si je peux manipuler une instance de ma collection et executer GetChaine depuis plusieurs threads simultanément ou bien si je dois encapsuler la méthode dans un bloc Sync Lock.
    Je pense cela doit passer sans SyncLock car je ne modifie aucune valeur, je ne fait que de la lecture d'ailleurs les propriété de ma "maClasse" sont toutes en lecture seul. Le seul hic c'est si le parcourre de la collection n'est pas "Thread Safe".
    Merci de vos conseils
    Cordialement
    Mael
    lundi 4 octobre 2010 12:53

Réponses

  • Bonjour,

    Vous n'avez pas à protéger votre collection des accès concurrents si vous faites que de la lecture. En revanche si un autre thread modifie le contenu de votre collection pendant la lecture, vous devez protéger cette collection via un ReadWriterLock.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse MaelstroeM lundi 4 octobre 2010 13:20
    lundi 4 octobre 2010 13:01
    Modérateur

Toutes les réponses

  • Bonjour,

    Vous n'avez pas à protéger votre collection des accès concurrents si vous faites que de la lecture. En revanche si un autre thread modifie le contenu de votre collection pendant la lecture, vous devez protéger cette collection via un ReadWriterLock.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse MaelstroeM lundi 4 octobre 2010 13:20
    lundi 4 octobre 2010 13:01
    Modérateur
  • Ok Merci.
    J'avais simplement un petit doute.
    (C'est vrai que moi je suis très Sync Lock alors que ReadWriterLock est quand même moins rigide.)

    lundi 4 octobre 2010 13:22