我尝试以至少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。花点时间了解重置事件并使用它们。