我有一些
我尝试使用以下代码将到期时间最大化为
但是事实证明,将
编辑:显然,无论你使用哪个
DateTime
变量,想要使用 System.Threading.Timer
等待直到这个时间到来。如果时间已过,我希望计时器立即启动。
问题是 TimeSpan.TotalMilliseconds
是 double
类型,而计时器的最大到期时间类型是 long
。我尝试使用以下代码将到期时间最大化为
long.MaxValue
:DateTime someUtcTime;
// Max due time to long.MaxValue
double doubleDueTime = Math.Min(
(double)long.MaxValue,
someUtcTime.Subtract(DateTime.UtcNow).TotalMilliseconds);
// Avoid negative numbers
long dueTime = Math.Max(0L, (long)doubleDueTime);
_timer.Change(dueTime, System.Threading.Timeout.Infinite);
但是事实证明,将
long.MaxValue
强制转换为双精度浮点数再转回长整型会得到一个负数(在未经检查的代码中)。请发送代码。
编辑:显然,无论你使用哪个
Timer.Change
重载,它们都受限于4294967294 (UInt32.MaxValue - 1
) 毫秒。
解决方案:
覆盖两个极端情况(someUtcTime = DateTime.MaxValue; UtcNow = DateTime.MinValue;
和反之亦然)。
const uint MAX_SUPPORTED_TIMEOUT = uint.MaxValue - 1; //0xfffffffe
DateTime someUtcTime;
double doubleDueTime = (someUtcTime - DateTime.UtcNow).TotalMilliseconds;
// Avoid negative numbers
doubleDueTime = Math.Max(0d, doubleDueTime);
// Max due time to uint.MaxValue - 1
uint dueTime = (uint)Math.Min(MAX_SUPPORTED_TIMEOUT, doubleDueTime);
Math.Min((double)long.MaxValue
的目的是什么? - Gabe