关于C#timer 时间精确度的问题

转自:http://bbs.youkuaiyun.com/topics/390952917

我想用精确的时间计算,需要精确到毫秒级别,代码运行后发下有误差。请教高人怎么实现。

C# code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static  System.Diagnostics.Stopwatch stw =  new  System.Diagnostics.Stopwatch();
static  int  testNum = 0;
stw.Start();
while  ( true )
{
       System.TimeSpan startTime = stw.Elapsed;
 
       if  (testNum % 100 == 0)
        {
 
              //TODO do something
 
              Console.WriteLine( string .Format( "循环{0}次,用时{1}秒。\r\n" , testNum, stw.Elapsed.TotalSeconds));
         }
 
         while  ((stw.Elapsed - startTime).TotalMilliseconds <= 10)
          {
                 System.Threading.Thread.Sleep(5);
           }
          testNum++;
}

结果如图:



要精确到毫秒,可以用StopWatch类,或者用GetTickCount API

前者msdn自己查,后者参考http://www.cnblogs.com/jxsoft/archive/2011/10/17/2215366.html


windows系统定时器精度默认是15.625ms,所以一般的办法不行。想要到10ms或者更高的精度需要通过api调整系统定时器到1ms精度,然后使用Socket.Poll来等待,这是能找到的最精确的方式,但是因为操作系统本身非实时,最后真正要每隔10ms执行任务估计很困难。所以最好先想想需求的必要性,再尝试实现。


windows不是“实时操作系统”,定时器误差在50毫秒都是正常的。如果这么干了,电脑上别的大量应用程序的性能会大大降低。windows上跑的是大量复杂的应用,同一时间有上千个线程进行抢先多任务调度,操作系统也很复杂。它不是只有几个非常简单的进程,它不能过分地修改定时器精度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值