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.