系统.计时器在.net核心没有正确跟踪时间



我有这段代码:

public void StartTimer(string roomName)
{
var roomTimer = GetRoomTimer(roomName);
var room = GetRoom(roomName);
if (roomTimer == null)
{
//Create a timer with a two second interval.
roomTimer = new System.Timers.Timer(2000);

roomTimer.Elapsed += (sender, e) => MyElapsedMethod(sender, e, room.Item2);
roomTimer.AutoReset = true;
roomTimer.Enabled = true;
_rooms[roomName].Timer = roomTimer;
}
else
{
roomTimer.Start();
roomTimer.AutoReset = true;
roomTimer.Elapsed += (sender, e) => MyElapsedMethod(sender, e, room.Item2);
_rooms[roomName].Timer = roomTimer;
}
}
public void StopTimer(string roomName)
{
var roomTimer = GetRoomTimer(roomName);
roomTimer.Stop();
}
private static void MyElapsedMethod(Object source, ElapsedEventArgs e, TwilioRoomDto room)
{
room.Time += room.Timer.Interval;
}

当计时器启动,然后当它停止并重新启动时,它不会跟踪时间几乎准确。误差几乎翻倍。为什么我在字典中保存时间流逝?

这不是跟踪时间流逝量的正确方法。如果你想要精确的时间测量,使用秒表

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;

根据不同的平台,秒表可以精确到亚微秒。

如果这不是你想要的,一个更好的设计是使用DateTime保存开始时间。现在,计算时间差。如果希望停止和重新启动,可以在计时器每次停止时将此差异存储在单独的TimeSpan中。但使用DateTime.Now将有更差的分辨率,大约1-16ms取决于平台。

最新更新