Random Crash

System.Random ist nicht Thread-sicher! Bei „gelichzeitigem“ Aufruf aus verschiedenen Threads, gibt Next() irgendwann nur noch „0“ zurück. Um dies zu verhindern, muss entweder jeder Aufruf an eine Random-Instanz durch „lock ()“ umschlossen werden:

lock (MyRandomMember)
{
    MyRandomMember.Next();
}

oder jeder Thread erhält eine eigene Random-Instanz, was bequem über das Attribut „ThreadStatic“ möglich ist:

[ThreadStatic]
private static Random _myRandomMember;

private static Random MyRandomMember
{
    get { return _myRandomMember ?? (_myRandomMember = new Random()); }
}

Schreib' einen Kommentar