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.