Est-ce threadsafe de la classe ValueStore? La portée du verrou dans GetInt (clé de chaîne) doit-elle être étendue autour du rendement du rendement?Est-ce que cette classe est threadsafe?
public class ValueStore
{
private readonly object _locker = new object();
private readonly Dictionary<string, int> _data =
new Dictionary<string, int>();
public ValueStore(Dictionary<string, int> data)
{
_data = data;
}
public IEnumerable<int> GetInt(string key)
{
IEnumerable<KeyValuePair<string, int>> selected;
lock(_locker)
{
selected = _data.Where(x => x.Key.Equals(key));
}
foreach (KeyValuePair<string, int> pair in selected)
{
yield return pair.Value;
}
}
}
Le test unitaire semble être bien:
[TestFixture]
public class ValueStoreTest
{
[Test]
public void test1()
{
Dictionary<string, int> data = new Dictionary<string, int>();
for (int i = 0; i < 100000; i++)
{
data.Add(i.ToString(),i);
}
ValueStore vs = new ValueStore(data);
for (int i = 0; i < 900000; i++)
{
ThreadPool.QueueUserWorkItem(delegate
{
for (int j = 0; j < 100000; j++)
{
IEnumerable<int> d = vs.GetInt(j.ToString());
}
});
}
}
}
Vous avez ici des problèmes plus sérieux que la sécurité des threads. Vous utilisez le dictionnaire incorrect. Vous l'utilisez comme une liste. - Vous semblez pouvoir affecter plusieurs valeurs à une clé. Tu ne peux pas. Donc, le rendement est inutile. - Vous enumerez toutes les valeurs dans le dictionnaire au lieu de simplement utiliser les méthodes contains/get. –