栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何获取.NET / C#中的滴答精度时间戳?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何获取.NET / C#中的滴答精度时间戳?

DateTime.Now
读取的系统时钟值仅每15毫秒左右(在某些系统上为10毫秒)更新一次,这就是为什么在这些间隔附近对时间进行量化的原因。由于您的代码在多线程OS中运行,因此还会产生额外的量化影响,因此在某些情况下,您的应用程序没有处于“活动”状态,因此无法测量实际的当前时间。

由于您正在寻找超准确的时间戳值(而不是仅计时任意持续时间),因此

Stopwatch
该类本身将无法满足您的需求。我认为您必须自己通过某种
DateTime
/
Stopwatch
混合方式来做到这一点。当您的应用程序启动时,您将存储当前
DateTime.UtcNow
值(即,应用程序启动时的原始分辨率时间),然后还启动一个
Stopwatch
对象,如下所示:

DateTime _starttime = DateTime.UtcNow;Stopwatch _stopwatch = Stopwatch.StartNew();

然后,每当您需要高分辨率

DateTime
值时,都将得到如下所示的结果:

DateTime highresDT = _starttime.AddTicks(_stopwatch.Elapsed.Ticks);

您可能还需要定期重置_starttime和_stopwatch,以防止产生的时间与系统时间过于不同步(尽管我不确定这是否会发生,并且无论如何都要花很长时间)

更新 :由于秒表 似乎确实 与系统时间
同步(每小时多达半秒),因此我认为

DateTime
根据两次调用检查之间经过的时间重置混合类是有意义的时间:

public class HiResDateTime{    private static DateTime _startTime;    private static Stopwatch _stopWatch = null;    private static TimeSpan _maxIdle =         TimeSpan.FromSeconds(10);    public static DateTime UtcNow    {        get        { if ((_stopWatch == null) ||      (_startTime.Add(_maxIdle) < DateTime.UtcNow)) {     Reset(); } return _startTime.AddTicks(_stopWatch.Elapsed.Ticks);        }    }    private static void Reset()    {        _startTime = DateTime.UtcNow;        _stopWatch = Stopwatch.StartNew();    }}

如果以某个固定间隔(例如每小时或某时)重置混合计时器,则冒着将时间设置为最后一次读取时间之前的风险,这有点像微型夏令时问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号