如何以最小的时间分辨率显示指定的功能精确的开始和停止时间

时间:2014-03-04 15:39:22

标签: c# datetime time

我试图获得interfaces.GetIPv4Statistics().BytesReceived;的确切开始和停止时间。

NetworkInterface interfaces;
public Form1()
{
    InitializeComponent();
    if (NetworkInterface.GetIsNetworkAvailable())
    {
        interfaces = NetworkInterface.GetAllNetworkInterfaces()[0];
    }
    Stopwatch timer = Stopwatch.StartNew();
    var time1 = DateTime.Now.ToString("HH:mm:ss:fff");
    //timer stop function take how much time? how if not ignored?
    timer.Stop();
    TimeSpan timespan = timer.Elapsed;
    //10ms for the conversion
    Console.WriteLine("Convert take time {0:00}:{1:00}:{2:000}", 
        timespan.Minutes, timespan.Seconds, timespan.Milliseconds);

    var timeStartGetStatistic = DateTime.Now.ToString("HH:mm:ss:fff");
    var currentByteReceive = interfaces.GetIPv4Statistics().BytesReceived;
    var timeEndGetStatisticAndConvert = DateTime.Now.ToString("HH:mm:ss:fff"); 

    Console.WriteLine("Start:\t{0}\nBytes Received:\t{1}\nStop:\t{2}",
        timeStartGetStatistic, currentByteReceive, timeEndGetStatisticAndConvert);

我使用秒表来获取DateTime.Now.ToString("HHmmss");

所需的时间

我认为timeEndGetStatisticAndConvert时间也包括转换为字符串的时间。

但结果是

  

转换时间00:00:010

     

开始时间:23:04:12:134

     

收到的字节数:700116647

     

停止:23:04:12:134

开始停止时间是 1ms 的分辨率相同 !!

所以秒表显示错误的经过时间跨度?

DateTime.Now.ToString()无法想象?

或者当我们显示DateTime.Now.ToString()的结果时,首先获得时间然后只转换为字符串? (显然这是答案并对此逻辑错误表示抱歉)

顺便说一下,我验证了这个

Stopwatch timer = Stopwatch.StartNew();
var currentByteReceive1 = interfaces.GetIPv4Statistics().BytesReceived;
timer.Stop();

0ms ....

所以我想知道在C#中,可以用来显示当前时间以及如何显示它的最小时间分辨率是什么?

最后显示interfaces.GetIPv4Statistics().BytesReceived;的确切开始和停止时间由

显示

矛盾发生在这里!!!

实际功能开始时间应为 10ms后第一次不是 !! 然后我的开始时间大于结束时间!!!

//variable name change because the real situation
//should be Add POSITIVE timespan.Milliseconds but not Add NEGATIVE
var timeStartGetStatisticAndConvert = DateTime.Now.AddMilliseconds(-(timespan.Milliseconds)).ToString("HH:mm:ss:fff");
var currentByteReceive = interfaces.GetIPv4Statistics().BytesReceived;
var timeEndGetStatistic = DateTime.Now.ToString("HH:mm:ss:fff"); 

Console.WriteLine("Start:\t{0}\nBytes Received:\t{1}\nStop:\t{2}",
    timeStartGetStatisticAndConvert, currentByteReceive, timeEndGetStatistic);
  

转换时间00:00:010

     

//如果更改了标志,请开始:23:04:14:124

     

开始时间:23:04:12:124

     

收到的字节数:700116647

     

停止:23:04:12:134

感谢。我将在另一篇文章中提出矛盾部分。

3 个答案:

答案 0 :(得分:0)

据我所知,DateTime.Ticks提供了C#中最小的时间分辨率。除此之外,您还需要Windows API提供的高分辨率计时器;它们通常用于媒体播放器(需要非常高精度的计时器)。

答案 1 :(得分:0)

看起来真的很复杂。这可能是因为您为 DateTime (“HH:mm:ss:fff”)选择的格式。

interfaces.GetIPv4Statistics().BytesReceived表示`接口已经初始化,数据已经存在,我相信(即 BytesReceived )。

基本上,你想要的是:

var start = DateTime.Now;
if (NetworkInterface.GetIsNetworkAvailable())
{
    interfaces = NetworkInterface.GetAllNetworkInterfaces()[0];
}
var currentByteReceive = interfaces.GetIPv4Statistics().BytesReceived;
Console.WriteLine("Timespan: {0}", DateTime.Now - start);

如果,就是说,我理解你要做的事情。

答案 2 :(得分:0)

尝试使用Elapsed或Tick propertie

Stopwatch timer = Stopwatch.StartNew();
            var currentByteReceive1 = interfaces.GetIPv4Statistics().BytesReceived;
            timer.Stop();
            Console.WriteLine(timer.Elapsed);

它给了我00:00:00.0026059(2,6毫秒)