110,533
社区成员
发帖
与我相关
我的任务
分享
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++;
}
windows系统定时器精度默认是15.625ms,所以一般的办法不行。想要到10ms或者更高的精度需要通过api调整系统定时器到1ms精度,然后使用Socket.Poll来等待,这是能找到的最精确的方式,但是因为操作系统本身非实时,最后真正要每隔10ms执行任务估计很困难。所以最好先想想需求的必要性,再尝试实现。
到底什么样的需求需要严格的10毫秒执行一次?这种级别的时间经度和cpu时钟有很大关系了,1楼版主的给你的方法可以精确计时(高精度下也和cpu时钟相关),但并不可以控制时间。你最好考虑下你的需求是否真的需要10毫秒精度。即便你间隔时间内保证,你的代码执行时间是否能每次精确在毫秒级内完成?
不知道楼主要实现什么功能,如果是要精确的控制代码执行的时机和时间的话,我觉得楼主需要一个实时操作系统,windows不适合你,至少标准的windows不适合
要精确到毫秒,可以用StopWatch类,或者用GetTickCount API 前者msdn自己查,后者参考 http://www.cnblogs.com/jxsoft/archive/2011/10/17/2215366.html
windows不是“实时操作系统” --> windows桌面或者服务器版不是“实时操作系统” 要纠结定时中断的“误差”,那你应该使用工业控制使用windows版。