怎么能避免在这一行出现OverflowException?

时间:2010-03-14 10:47:49

标签: .net vb.net exception overflow casting

LastInput.time是一个整数,m_idleTime也是一个整数。这一行有时会产生溢出异常,我认为当两个值都是大的负值时会发生这种情况。

(Environment.TickCount - lastInput.time) > m_idleTime

我该如何避免?铸造?

(CType(Environment.TickCount,Long) - CType(lastInput.time,Long)) > m_idleTime

或者也许是这个演员?

CType((Environment.TickCount - lastInput.time),Long) > m_idleTime

提前致谢。

编辑:我正在使用GetLastInputInfo方法来检查计算机空闲的时间。我通过这种方式声明了调用的返回值:

    <StructLayout(LayoutKind.Sequential)> Public Structure StructLastInputInfo
        <MarshalAs(UnmanagedType.U4)> Dim size As Integer
        <MarshalAs(UnmanagedType.U4)> Dim time As Integer
    End Structure

所以我认为当Environment.TickCount返回负值时,GetLastInputInfo会发生同样的情况,对吧?但是,减法的价值将是错误的,因为它们将是负面的,所以就我看到问题应该做的是:

Math.Abs(CType(Environment.TickCount, Long) - CType(lastInput.time, Long)) > m_idleTime

您怎么看?

4 个答案:

答案 0 :(得分:1)

假设问题与您所描述的一样,您需要第一个选项:

(CType(Environment.TickCount,Long) - CType(lastInput.time,Long)) > m_idleTime

第二个在转换为Long之前会失败,因为转换是在计算之后完成的。

但我认为你不应该在这个计算中有大的负值。请注意,在24.9天后,Environment.TickCount溢出并变为负数。也许这就是发生的事情?如果是这样,上面的代码将不会抛出,但它会给出错误的答案。

你为什么这样做?为什么不只比较两个DateTimes?

答案 1 :(得分:1)

是的,此代码将在机器运行2 ^ 31毫秒后爆炸。您无法在VB.NET中有选择地抑制溢出检查。对此只有一个修复:项目+属性,编译选项卡,向下滚动,高级编译选项,选中“删除整数溢出检查”。这不是一个可怕的损失,但你确实失去了一定程度的保护。

另一种不会导致溢出的方法是使用DateTime.UtcNow。减法生成TimeSpan,使用其TotalMilliseconds属性。准确性是一样的。请注意它返回Double,避免相等检查。

答案 2 :(得分:0)

在C#中我们只使用“未选中”块。不确定VB.NET中的等价物是什么。

答案 3 :(得分:0)

这就是我解决问题的方法:

            currentTime = BitConverter.ToUInt32(BitConverter.GetBytes(Environment.TickCount), 0) #'' This code can fail with 1 tick error when changing the sign of one item.
            lastInputTime = BitConverter.ToUInt32(BitConverter.GetBytes(lastInput.time), 0)

            If currentTime - lastInputTime > m_idleTime Then

此代码有效,因为您获取了Integer的字节并只使用它们就好像它们在UInteger中一样,这不会抛出OverflowException。

我看到的唯一问题是,当一个项目的符号发生变化时,在减法时出现1个单位错误,不确定发生了什么,但无论如何都有1个勾选错误不是问题。