.net 如何避免在这一行出现溢出异常?

.net 如何避免在这一行出现溢出异常?,.net,vb.net,exception,overflow,casting,.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

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

您认为如何?

假设问题如您所述,您需要这些选项中的第一个:

(CType(Environment.TickCount,Long) - CType(lastInput.time,Long)) > m_idleTime
第二个将在转换为Long之前失败,因为转换是在计算之后完成的

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


你为什么这样做?为什么不比较两个日期时间呢?

在C#中,我们只使用“unchecked”块。不确定VB.NET中的等效代码是什么。

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


另一种不导致溢出的方法是使用DateTime.UtcNow。减法生成时间跨度,请使用其TotalMillicles属性。精度是一样的。请注意,它返回一个双精度,避免进行相等检查。

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

            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
这段代码之所以有效,是因为您获取整数的字节,并将它们当作UInteger使用,这不会引发OverflowException


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

在我看来,第一个选项将解决您的问题。第二个选项对StackOverflow没有任何作用,因为它会在将结果强制转换为Long之前发生。据我所知,此功能在Vb.NetWell中不可用,事实上,此错误是在长时间运行后发生的。我这样做是因为我使用的是GestLastInput Windows API,它返回一个整数tickcount,而不是日期时间。我不知道是否有更好的方法。长时间运行大约25天吗?是的,它可以运行超过25天。但是做演员也可以避免例外,不是吗?没有例外,但计时器也不再工作。您需要溢出使其工作。是的,它将使用LastInputInfo.dwTime失败。使用DateTime不起作用,请使用“删除整数溢出检查”选项。如果你想在剩下的代码中保留代码,你可以将代码放在一个单独的程序集中。嗯,你能说说为什么我的最后一行行不通吗?就我所见,这个问题应该可以解决,因为现在你没有溢流了,标志的改变是由Abs来处理的,对吗?提前感谢Nobugz,我记得你在这里和其他论坛上帮助过我好几次。非常感谢。插上电话号码。当蜱虫从+2147483647(2^31-1,&H7fffffff)滚动到-2147483648(&H80000000)时,它会变成卡普。
            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