C# 将TimeSpan.TotalMillistics转换为long

C# 将TimeSpan.TotalMillistics转换为long,c#,.net,timespan,C#,.net,Timespan,我有一些DateTime变量,我想使用System.Threading.Timer来等待这个时间的到来。如果时间已过,我希望计时器立即计时 问题是时间跨度。总毫秒数是两倍,计时器到期时间最大的类型是长 我已尝试使用以下代码最大化long.MaxValue的到期时间: DateTime someUtcTime; // Max due time to long.MaxValue double doubleDueTime = Math.Min( (double)long.MaxValue,

我有一些
DateTime
变量,我想使用
System.Threading.Timer
来等待这个时间的到来。如果时间已过,我希望计时器立即计时

问题是
时间跨度。总毫秒数
是两倍,计时器到期时间最大的类型是长

我已尝试使用以下代码最大化
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
加倍并返回到long会导致一个负数(在未检查的诅咒代码中)。请给我发一封信


编辑:显然,无论使用哪种重载,它们都被限制为4294967294(
UInt32.MaxValue-1
)毫秒


解决方案: 涵盖两种极端情况(
someUtcTime=DateTime.MaxValue;UtcNow=DateTime.MinValue;
反之亦然)


计时器设计为等待时间间隔(通常短于24小时)

你的预期用途是什么?调度程序通常会有一个事件/任务列表,并每隔一分钟(可能每秒)定期检查是否需要触发任何任务


也许类似的东西可能是合适的?

可能只是使用Ticks属性(Ticks很长)并乘以TimeSpan.tickspermillis秒(常数,10000 Ticks/millis秒)。

因为
(DateTime.MaxValue-DateTime.MinValue).TotalMillics
为315537897600000且
较长。MaxValue
为9223372036854775807(
long
可以表示比任何两个
DateTime
值之间的最大可能毫秒数大4个数量级的值),未来的时间不会太长

这就足够了:

DateTime someUtcTime;
// Max due time to long.MaxValue
double doubleDueTime = (someUtcTime - DateTime.UtcNow).TotalMilliseconds;

// Avoid negative numbers
long dueTime = Math.Max(0L, (long)doubleDueTime);

_timer.Change(dueTime, System.Threading.Timeout.Infinite);
Timespan Timespan=someUtcTime.Subtract(DateTime.UtcNow);

long time=timespan.totalmillizes你的代码中的
Math.Min((double)long.MaxValue
部分的目的是什么?“请给我发一封信给codez。”-希望这是幽默!@Gabe:未来的约会太远了?@Mitch,这看起来像是一个简单的2分钟任务,但我无法正确完成。挫折让我产生了幽默感。这是一种说法:“我的学者们,你们将如何解决这一难题?”。我希望这并不是完全禁止幽默:)你担心3亿年后的时间戳吗?它是一种调度器,但它的功能太少了,我不想把它与第三方库结合在一起。听起来它会起作用,但不知怎的,我觉得在现实世界中使用滴答声是不自然的。也许只有我一个人。很好的一点,伙计。尽管,在我编辑时,我认为限制是UInt32.MaxValue-1,所以它适用于。我只使用这个+@Marino的。注意,我假设时间是正的,霍金建议时间甚至可能是微不足道的,或者是倒退的,所以“-1”可能是一个可能的时间量:)
DateTime someUtcTime;
// Max due time to long.MaxValue
double doubleDueTime = (someUtcTime - DateTime.UtcNow).TotalMilliseconds;

// Avoid negative numbers
long dueTime = Math.Max(0L, (long)doubleDueTime);

_timer.Change(dueTime, System.Threading.Timeout.Infinite);
Timespan timespan = someUtcTime.Subtract(DateTime.UtcNow);
long time = timespan.TotalMilliseconds <= long.MaxValue ? (long)timespan.TotalMilliseconds : -1;

if (time == -1) {
 sorry.nocando();
}
else {
 just.doit();
}