如何在C#中获得精确的DateTime

Rob*_*los 6 c# datetime

我知道它DateTime.UtcNow没有相对较高的精度(10-15 ms分辨率).

这对我来说是一个问题,因为在我的日志文件中,我想要更好的解决方案来解决竞争条件.

问题是:如何以比DateTime.UtcNow提供的更精确的方式获得当前日期/时间?

到目前为止,我见过的唯一解决方案是:https://stackoverflow.com/a/15008836/270348.这是解决问题的合适方法吗?

Ser*_*rvy 9

您可以使用Stopwatch更精确的时间测量.然后,您可以让每个日志条目记录从第一个操作开始的时间.如果它很重要,你可以记录DateTime第一个操作并因此计算剩下的时间,但听起来只是因为第一个操作开始时的滴答/纳秒就足够了.

  • 值得注意的是,秒表相对于挂钟时间漂移,因此在启动时采用 DateTime.UtcNow 然后添加秒表派生的偏移量只会在同一系统中产生相对于彼此“正确”的时间戳,而不是跨系统。随着时间的推移,精度会很差(互联网似乎认为每秒漂移高达 0.2ms 的情况并不少见)。 (2认同)

Alo*_*aus 5

如果您想添加跟踪,您可以像这里一样编写自己的 ETW 跟踪提供程序。那么你就不需要关心时间是如何获取的。Windows 内核会确保计时准确且事件顺序正确。

如果您不想编写自己的 ETW 提供程序,您可以使用作为 Nuget 包提供的 EventSource,它也允许您从 .NET 4.0 使用它。更多信息在他的博客上有万斯莫里森

使用 ETW 事件时,您可以通过 Windows 性能工具包免费获得强大的跟踪分析器。作为额外的好处,您可以在所有流程中进行系统范围的分析,而且影响最小。

这允许您有选择地为您编写的每个事件添加调用堆栈,这在您想要追踪谁两次调用您的 Dispose 方法时非常有用。

在此处输入图片说明