Nella mia app ogni utente che si connette al server deve ottenere un colore distinto a caso e devo tenerne traccia. Circa 20 a 30 saranno collegati nello stesso tempo. Quando un utente si disconnette, il suo colore viene rimosso.
La mia domanda è se l'ho fatto correttamente per quanto riguarda le prestazioni e la sicurezza dei thread.
public class RandomColorGenerator
{
private static IList<Color> currentColors = new List<Color>();
private static Random random = new Random((int)DateTime.UtcNow.Ticks);
private object lockObject = new object();
public Color GetRandomColor ( )
{
var color = Color.FromArgb(random.Next(200, 255), random.Next(150, 255), random.Next(150, 255));
lock ( lockObject )
{
if ( currentColors.Contains(color, new ColorEqualityComparer()) )
return GetRandomColor();
else
{
currentColors.Add(color);
return color;
}
}
}
public void DismissRandomColor (Color color)
{
lock ( lockObject )
{
var tmpColor = currentColors.SingleOrDefault(x=>x.ToArgb() == color.ToArgb());
currentColors.Remove(tmpColor);
}
}
}
public class ColorEqualityComparer : IEqualityComparer<System.Drawing.Color>
{
public bool Equals (Color x, Color y) => x.ToArgb() == y.ToArgb();
public int GetHashCode (Color obj) => obj.GetHashCode();
}
EDIT:
Grazie a tutti per il vostro aiuto e i vostri consigli, mi avete aiutato molto su questo problema e sono anche riuscito a imparare un paio di cose extra :) Dato che la casualità non era davvero necessaria, creerò solo circa 60 colori casuali offline e memorizzarli in un array o in un dizionario e assegnarli agli utenti in base alle esigenze.