Error en el constructor System.Random?

losSystem.Threading.ConcurrentQueue.TryDequeue El otro día el método lanzó una excepción que me tomó totalmente por sorpresa. Aquí está la traza de la pila:

System.OverflowException: Negating the minimum value of a twos complement number is invalid.
   at System.Math.AbsHelper(Int32 value)
   at System.Random..ctor(Int32 Seed)
   at System.Threading.Collections.ConcurrentQueue`1.TryDequeueCore(T& result)
   at System.Threading.Collections.ConcurrentQueue`1.TryDequeue(T& result)
   at MyProgram.ThreadProc() in c:\MyProgram\Main.cs:line 118
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Al principio pensé que el problema era queTryDequeueCore llamó alRandom Constructor con un mal valor. Pero más investigación revela queTryDequeueCore llama al constructor por defecto. Me parece que el error está en elRandom constructor:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       int32 System.Environment::get_TickCount()
  IL_0006:  call       instance void System.Random::.ctor(int32)
  IL_000b:  ret
} // end of method Random::.ctor

Como la documentación para elSystem.Environment.TickCount propiedad dice:

El valor de esta propiedad se deriva del temporizador del sistema y se almacena como un entero con signo de 32 bits. En consecuencia, si el sistema se ejecuta continuamente, TickCount aumentará de cero a Int32 .. ::. MaxValue durante aproximadamente 24.9 días, luego saltará a Int32 .. ::. MinValue, que es un número negativo, y luego volverá a cero durante el próximos 24.9 días.

Así que, si llamas alRandom durante ese período de un milisegundo (después de que el sistema haya estado listo paraint.MaxValue milisegundos), va a lanzar esta excepción.

¿Alguien tiene una solución? Para mi propio código, puedo hacer unCreateRandom método que obtiene elTickCount valor y lo compruebaint.MinValue. ¿Pero qué hacer con el código sobre el que no tengo control?

Espero que el equipo de RTL arregle esto en .NET 4.0.

Actualización 22/07/2009: El equipo de BCL respondió al error y dijo que se había resuelto para la próxima versión.