定时器比间隔多10 ms

Emb*_*rja 3 .net c# timer

我正在使用间隔1秒的计时器.但是在计时器的刻度事件中,当我打印时间时,它总是62或65毫秒.我不明白为什么它要多花10毫秒.

有人可以看看这个.

这是我正在使用的代码:

static int _counter;
var _timer = new System.Timers.Timer(1000);
public Form1()
{
    InitializeComponent();           
    _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
    _timer.Start();            
}

private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Console.WriteLine(DateTime.Now.ToString("{hh:mm:ss.fff}"));          
    _counter++;
    if (_counter == 20)
        _timer.Stop();
}
Run Code Online (Sandbox Code Playgroud)

这个输出:

{01:59:08.381}
{01:59:09.393}
{01:59:10.407}
{01:59:11.421}
{01:59:12.435}
{01:59:13.449}
{01:59:14.463}
{01:59:15.477}
{01:59:16.491}
{01:59:17.505}
{01:59:18.519}
{01:59:19.533}
{01:59:20.547}
{01:59:21.561}
{01:59:22.575}
{01:59:23.589}
{01:59:24.603}
{01:59:25.615}
{01:59:26.629}
{01:59:27.643}
Run Code Online (Sandbox Code Playgroud)

tva*_*son 14

您需要了解Windows不是实时操作系统.实时操作系统具有计时器机制,允许系统对计时器启动的事件何时发生以及与之相关的开销做出硬性保证,并允许您指定在错过最后期限时应发生的行为 - 例如,如果以前的执行时间比间隔长.

在较小的时间间隔内,我会将Windows计时器描述为"尽力而为".当间隔足够长时,您不会注意到您没有得到您请求的确切间隔.随着您越来越接近计时器的分辨率(计时器运行的频率),您开始将间接开头视为间隔增加的百分比.实时系统需要特别注意最小化软件开销,依赖于更复杂和更快速的硬件解决方案.Windows计时器的确切频率取决于底层硬件提供的计时服务,因此可能因系统而异.

如果您有实时需求 - 并且每50毫秒做一些事情可能属于该类别 - 那么您可能需要查看专用硬件和/或实时操作系统.


Guf*_*ffa 6

这是因为系统时钟的分辨率有限.事件发生在指定时间之后的下一个系统节拍中,因此您将总是获得几毫秒的额外时间.


Joh*_*ies 5

如果您需要更精确的计时器,您可以挂钩 Win32 多媒体计时器,它是最准确的计时器(低至 1 毫秒)。这是一篇关于CodeProject的文章,展示了如何从 C# 连接到它。