Meilleur auteur de réponses
ReadOnlyCollection et Securité des Thread

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
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- Modifié MaelstroeM lundi 31 août 2009 06:59
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
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
-
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