none
ReadOnlyCollection et Securité des Thread RRS feed

  • Question

  • Bonjour,

    J'ai créé une classe qui hérite de System.Collections.ObjectModel.ReadOnlyCollection(Of T)
    J'ai implementé une methode dans laquelle je dois énumérer ma collection.

    Compte du fait que la liste sous jacent (passé via le constructeur) ne sera jamais modifiée (la reférence est perdue), puis-je considérer que ma classe fille est thread safe ?

    Voici le code, trés simple :

    Public Class MyReadOnlyCollection
    
        Inherits System.Collections.ObjectModel.ReadOnlyCollection(Of MyClasse)
    
        Public Sub New(ByVal listOfMyClass As System.Collections.Generic.IList(Of MyClasse))
    
            MyBase.New(listOfMyClass)
    
        End Sub
    
        Public Function GetPath(ByVal idBatch As Integer) As String
    
            Dim searchId As Integer
    
            searchId = idBatch Mod (MyBase.Count)
    
            For Each Objt As MyClasse In Me
    
               If searchId = Objt.Id Then Return Objt.FolderPath
    
            Next
    
            Return String.Empty
    
         End Function
    
    End Class
    
    
    
    
    
    
    
    
    D'ailleurs je mis à pars ajouter un bloc SyncLock pour encapsuler ma function je ne vois pas trop ce que je peux faire d'autre.
    Mais je ne pense pas que ce soit utile, cette méthode n'utilise aucune ressource partagé, si ce n'est la collection en lecture seule, qui selon MSDN semblre thread-safe en lecture :

    "ReadOnlyCollection peut prendre simultanément en charge plusieurs lecteurs, tant que la collection n'est pas modifiée."
    http://msdn.microsoft.com/fr-fr/library/ms132474(VS.85).aspx

    Dans le même esprit j'ai une dernière question : plusieurs threads manipulent la même instance d'un objet, ces manipulations ne sont que des lectures des propriétés de l'instance de mon objet.
    Dois-je protégé les accés aux propriété via un SyncLock dans les accesseurs ?

    Merci de vos conseils (comme toujours) !!!
    Mael
    vendredi 28 août 2009 09:12

Réponses

  • Salut MaelstroeM,
    Si tu crées l'objet et après ça tu crées des threads qui seulement lisent les propriétés, tout est bien.
    Sinon, un SyncLock dans les sections Set des propriétés de la classe est tout ce qu’il faut.
    Cordialement,
    Marius
    • Marqué comme réponse MaelstroeM jeudi 3 septembre 2009 06:13
    mercredi 2 septembre 2009 23:40

Toutes les réponses

  • Salut MaelstroeM,
    Si tu crées l'objet et après ça tu crées des threads qui seulement lisent les propriétés, tout est bien.
    Sinon, un SyncLock dans les sections Set des propriétés de la classe est tout ce qu’il faut.
    Cordialement,
    Marius
    • Marqué comme réponse MaelstroeM jeudi 3 septembre 2009 06:13
    mercredi 2 septembre 2009 23:40
  • Effectivement, l'objet est créé sur le thread principal (dans le Main()).
    Ensuite des threads sont créés pour realiser des traitement en utilisant la methode "BeginInvoke" d'un délégué (modèle asynchrone basé sur des événements proposé dans MSDN).

    Merci de l'info, je vais pouvoir faire un peu de ménage dans l'application, car jusqu'à maintenant, dans le doute je créée une instance d'objet "paramètres" pour chaque thread, alors que ces paramétres sont identiques pour tous et qu'ils ne sont jamais modifiés.

    Cordialement
    Mael
    jeudi 3 septembre 2009 06:25