J'ai ce segment de code, beaucoup de choses sautée par souci de concision, mais la scène est celle-ci:Quelles sont les options disponibles pour sécuriser ce thread de code?
public class Billing
{
private List<PrecalculateValue> Values = new List<PrecalculateValue>();
public int GetValue(DateTime date)
{
var preCalculated = Values.SingleOrDefault(g => g.date == date).value;
//if exist in Values, return it
if(preCalculated != null)
{
return preCalculated;
}
// if it does not exist calculate it and store it in Values
int value = GetValueFor(date);
Values.Add(new PrecalculateValue{date = date, value = value});
return value;
}
private object GetValueFor(DateTime date)
{
//some logic here
}
}
J'ai un List<PrecalculateValue> Values
où je stocke toutes les valeurs i déjà calculées pour une utilisation ultérieure, je fais ces principalement parce que je ne veux pas recalculer des choses deux fois pour le même client, chaque calcul implique beaucoup d'opérations et prend entre 500 et 1000 ms, et il y a une grande chance de réutiliser cette valeur, à cause d'une certaine récursion dans le trou classe de facturation. Tout cela fonctionne parfaitement jusqu'à ce que j'ai fait un test où j'ai frappé deux calculs simultanés pour deux clients différents, et la ligne Values.Single(g => g.date == date).value
a renvoyé une exception car elle a trouvé plus d'un résultat dans la collection. J'ai donc vérifié la liste et stocké les valeurs des deux clients dans la même liste. Que puis-je faire pour éviter ce petit problème?
+1 pour l'utilisation d'un dictionnaire codé sur le DateTime. Aussi, si vous utilisez .NET 4, il y a un nouveau ConcurrentDictionary qui gérera le verrouillage pour vous lors de l'ajout de nouveaux objets. –
hehe, yep ceux qui ont commenté si font partie de la logique =), sry à ce sujet. Je vais essayer plus tard – JOBG
ConcurrentDictionary, nice –