Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中暂停线程以获得比线程更精确的时间。睡眠-什么是最好的方法?_C#_Sleep_Pause - Fatal编程技术网

在C#中暂停线程以获得比线程更精确的时间。睡眠-什么是最好的方法?

在C#中暂停线程以获得比线程更精确的时间。睡眠-什么是最好的方法?,c#,sleep,pause,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.Mouse

我有这个密码:

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);
    }
}
while(MouseKeyboardStateTest.Keyboard.IsKeyDown(Keys.Space))
{
键盘。按键(A键);
线程睡眠(asChecker.currentDelay);

对于(inti=0;i不使用
Thread.Sleep

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

这将允许您在没有延迟的情况下获得关键事件的通知,并且不会出现冻结UI的循环

另请参见

您也可以使用游戏API。这些API允许您对鼠标和按键事件做出快速反应,而不受控件的限制。它们还允许您检测同时按下的按键


由于您不是在UI中执行此操作(根据您的评论),因此我建议采用不同的方法:

在游戏中,您通常使用一个游戏循环,该循环尽可能快地循环,没有任何
线程。睡眠
延迟。在每个循环中,您检查输入的当前状态(键盘、鼠标、操纵杆),并相应地更新游戏状态和显示

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


如果
DateTime
不够准确,请使用
StopWatch
类。请参阅:。

它与需要的准确度完全相同。操作系统线程调度程序只查找准备在“心跳”时运行的线程,时钟滴答声中断。它通常每秒滴答声64次。当您打开浏览器时,它的滴答声往往为100次。您不能假设您的线程在睡眠时间到期时实际获得处理器,它还必须与其他需要服务的线程竞争。使用thread.Priority可能有助于获得不公平的份额。要获得g保证它将是10毫秒,而不是15.625秒。您需要pinvoke timeBeginPeriod()。我没有使用任何UI,延迟是因为它在游戏中执行操作,需要一定的延迟。由于您重新打开并回答了问题,请用更好的标题编辑问题。现在,出现此问题的人可能会遇到与您在此处回答的问题完全不同的问题。