与Thread.Sleep相比,在C#中暂停线程可获得更准确的时间-最佳方法是什么?

时间:2018-11-07 16:54:29

标签: c# sleep pause

我有以下代码:

while(MouseKeyboardStateTest.Keyboard.IsKeyDown(Keys.Space))
{
    Keyboard.KeyPress(Keys.A);
    Thread.Sleep(asChecker.currentDelay);
    for (int i = 0; i <= asChecker.currentMouseClicks; i++)
    {
        Mouse.PressButton(Mouse.MouseKeys.Right);
        Thread.Sleep(globalMouseDelay);
    }
}

它工作正常,问题是-Thread.Sleep不准确,并且延迟并不总是相同。 我还有其他方法可以解决此问题,使其至少精确到10ms吗?

1 个答案:

答案 0 :(得分:2)

完全不要使用Thread.Sleep

将表单的KeyPreview设置为true并使用表单的键事件。

这将使您获得关键事件的通知,而不会出现滞后,也不会循环冻结UI。

另请参见this answerWinforms : Intercepting Mouse Event on Main Form first, not on Controls

您也可以改用游戏API。这些使您可以非常快速地对鼠标和键事件做出反应,而不必与控件绑定。它们还使您能够检测同时按键。


由于您不是在用户界面中执行此操作(根据您的评论),所以我建议采用另一种方法:

在游戏中,您通常使用尽可能快地循环的游戏循环,没有任何Thread.Sleep延迟。在每个循环中,您都要检查输入的当前状态(键盘,鼠标,操纵杆),并更新游戏状态并进行相应显示。

在每个循环中,用DateTime.UtcNow(比DateTime.Now更快的时间)保存当前时间,并检查自从某个操作发生以来经过的时间,以了解是否已达到所需的延迟。

如果DateTime不够准确,请使用StopWatch类。参见:Precision and accuracy of DateTime