1

在客户端系统的日志中记录了以下异常。

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 抛出异常似乎在多线程环境中对此给出了解释。但是我的调用堆栈上没有调用,DateTime.get_Now所以它真的是相同的根本原因吗?

4

1 回答 1

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.

于 2013-04-02T08:10:39.453 回答