Les classes:question de verrouillage de base en C#
public class SomeCollection
{
public void IteratorReset()
{
index = -1;
}
public bool IteratorNext()
{
index++;
return index < Count;
}
public int Count
{
get
{
return floatCollection.Count;
}
}
public float CurrentValue
{
get
{
return floatCollection[index];
}
}
public int CurrentIndex
{
get
{
return intCollection[index];
}
}
}
classe qui tient référence à 'SomeCollection':
public class ThreadUnsafeClass
{
public SomeCollection CollectionObj
{
get
{
return collectionObj;
}
}
}
Classes ClassA
, ClassB
et ClassC
contiennent la boucle suivante qui itère sur CollectionObj:
for (threadUnsafeClass.CollectionObj.IteratorReset(); threadUnsafeClass.CollectionObj.IteratorNext();)
{
int currentIntIndex = threadUnsafeClass.CollectionObj.CurrentIndex;
float currentfloatValue = threadUnsafeClass.CollectionObj.CurrentValue;
// ...
}
Puisque je suis seulement lecture CollectionObj dans les 3 classes, j'utilise multithreading pour l'accélération, mais je ne suis pas sûr de savoir comment faire appliquer la sécurité des threads. J'ai ajouté un verrou dans ThreadUnsafeClass lors de la récupération de CollectionObj, mais l'application génère une exception hors de portée.
Toute aide est appréciée.
Merci!
Merci Jon.Quel impact le retour d'un nouvel objet dans GetEnumerator() a-t-il sur les performances étant donné que ma collection est généralement très grande et que la section loop est appelée des centaines de milliers de fois? – alhazen
@alhazen: Si la collection est très grande, cela * réduira * l'impact de la création d'un objet supplémentaire - parce que vous n'en créez pas un à chaque itération, juste une fois pour toute la boucle. Vous * pourriez * utiliser un type de valeur si vous * vouliez vraiment, comme 'List', mais je ne ferais certainement pas cela tant que vous ne saviez pas que vous aviez un problème. –
Désolé de vous corriger à nouveau. J'ai modifié 'SomeCollection' pour qu'il implémente' IEnumerable 'comme vous l'avez suggéré. Actuellement, GetEnumerator() renvoie 'floatListCollection.GetEnumerator()' mais je n'ai pas pu trouver de message décrivant un moyen de renvoyer un nouvel objet énumérateur à chaque appel. Puis-je utiliser le clonage dans ce cas? Merci. –
alhazen