在客户端系统的日志中记录了以下异常。
System.ArgumentOutOfRangeException: Value to add was out of range.
Parameter name: value
at System.DateTime.Add(Double value, Int32 scale)
at ButtonPressed()
at MessageEvent(MessageEventArgs e)
自定义方法非常简单
Public Sub ButtonPressed
If mWindows.Count > 0 AndAlso mLastEvent.AddSeconds(1) > Now
PostMessage(New IntPtr(mHwnd), 1125, UIntPtr.Zero, IntPtr.Zero)
End If
End Sub
我很难解释如何调用这样的调用堆栈,因为DateTime.Add(Double value, Int32 scale)
是一个私有方法,而不是我的代码调用。
DateTime.Now is throwing an exception似乎在多线程环境中对此进行了解释。但是我的调用堆栈上没有调用DateTime.get_Now
,所以它的根本原因是否真的相同?
答案 0 :(得分:2)
我怀疑JIT已经内联了AddSeconds
方法,这就是全部。
例如,请考虑这个非常简单的代码:
using System;
class Test
{
static void Main()
{
var max = DateTime.MaxValue;
var oops = max.AddSeconds(1);
}
}
在我的.NET 4.5计算机上,它生成一个堆栈跟踪:
Unhandled Exception: System.ArgumentOutOfRangeException:
The added or subtracted value results in an un-representable DateTime.
Parameter name: value
at System.DateTime.AddTicks(Int64 value)
at Test.Main()
请注意缺少AddSeconds
来电。现在它与您所看到的不完全相同,但这可能是由于框架版本的差异。
我建议您在方法开头记录mLastEvent
- 我的猜测是您会发现它接近DateTime.MaxValue
。