System.Random构造函数中的错误?

时间:2009-07-18 18:52:17

标签: c# .net

System.Threading.ConcurrentQueue.TryDequeue方法在前几天引发了一个异常,让我完全惊讶。这是堆栈跟踪:

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()

起初我认为问题是TryDequeueCoreRandom构造函数称为错误值。但进一步调查显示TryDequeueCore调用默认构造函数。它看起来像错误在Random构造函数中:

.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

正如System.Environment.TickCount属性的文档所示:

  

派生此属性的值   来自系统计时器并存储为   一个32位有符号整数。所以,   如果系统连续运行,   TickCount将从零增加到   Int32 .. ::。MaxValue大约   24.9天,然后跳转到Int32 .. ::。MinValue,这是一个   负数,然后递增   在接下来的24.9天内为零。

因此,如果你在一毫秒的时间内调用Random构造函数(在系统启动int.MaxValue毫秒之后),它将抛出此异常。

有人有解决方法吗?对于我自己的代码,我可以创建一个获得CreateRandom值的TickCount方法,并将其检查为int.MinValue。但是如何处理我无法控制的代码呢?

我希望RTL团队在.NET 4.0中修复此问题。

2009/07/22更新:BCL团队回复了该漏洞并表示已经解决了下一个版本。

1 个答案:

答案 0 :(得分:4)

try / catch并且稍后重试一段时间似乎只是你可以做的唯一事情,直到这个bug得到解决。