一毫秒间隔事件C#

时间:2016-08-29 16:25:40

标签: c# performance events optimization cpu

我尝试以至少1毫秒和最长1.9毫秒的速度向USB设备发送消息。我发现C#中内置的每个计时器都可以在大约4ms的时间内运行并且非常零星。我意识到这是Windows限制的一部分,最终将实现到USB设备固件而不是客户端应用程序。

当前有效的代码:

    while (timer.ElapsedMilliseconds < LastMessageActivity + IntervalDelay) ;
    Send(message);
    LastMessageActivity = timer.ElapsedMilliseconds;

我唯一的问题是,这耗费了极大的CPU,我在I7-6700K上看到了大约10%的CPU。我试图使用Thread.Sleep(0),这导致大约3ms被添加到每个消息的间隔时间,但确实将CPU使用率降低到基本没有。

关于如何降低CPU使用率或实现每毫秒实际触发的1ms事件的任何建议都会很棒。

更新: 您可以通过使用以下代码来显着降低CPU使用率:

SpinWait.SpinUntil(() => (!(timer.ElapsedMilliseconds < LastMessageActivity + IntervalDelay));
Send(message);
LastMessageActivity = timer.ElapsedMilliseconds;

更新2: 不要做SpinWait。花点时间了解重置事件并使用它们。

0 个答案:

没有答案