c# While Loop issues

本文关键字:issues Loop While | 更新日期: 2023-09-27 18:00:55

    while (TOGGLE == false) {
            if (Keyboard.IsKeyDown(Key.A)) { RESULT = RESULT + "A";}
            if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); }
            if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); }
    }

好的,所以当我点击B或C键时,一切都很好,它会将单词添加到字符串变量RESULT中,但当我点击A时,它会向RESULT字符串添加无限数量的A。我做错了什么?

编辑:我知道我并没有将TOGGLE设置为false。但这就是重点!我会更好地解释:这个应用程序将在后台运行。因此,当客户端在记事本中写入时,该程序将检测到他按下的每一个键,并将其添加到RESULT字符串中。我不希望这个while循环在按键后立即停止。我希望它循环,直到客户端在记事本中完成写入(这时我将TOGGLE设置为false(。

c# While Loop issues

因为当消息框出现时,您正在阻止循环,但对于A,没有消息框可以防止ui线程在按下A键时继续循环。

你需要

break;

在附加字符串后退出循环,或者显示一个消息框,这取决于您想要实现的目标。

当您显示一个消息框时,它会阻止while循环继续,因为对消息框的调用是一个阻塞调用。这意味着在关闭消息框之前,代码不会继续执行。

在您的示例中,当您按A时,不会显示消息框,因此循环将继续。若要解决此问题,必须将Toggle设置为true。

while (TOGGLE == false) 
{
    if (Keyboard.IsKeyDown(Key.A)) 
    { 
        RESULT = RESULT + "A";
        TOGGLE = true;
    }
    if (Keyboard.IsKeyDown(Key.B)) 
    { 
        RESULT = RESULT + "B"; 
        MessageBox.Show(RESULT);
        TOGGLE = true;
    }
    if (Keyboard.IsKeyDown(Key.C)) 
    {
        RESULT = RESULT + "C"; 
        MessageBox.Show(RESULT); 
        TOGGLE = true;
    }
}

我知道我没有将TOGGLE设置为false。但这就是重点!我会更好地解释:这个应用程序将在后台运行。因此,当客户端在记事本中写入时,该程序将检测到他按下的每一个键,并将其添加到RESULT字符串中。我不希望这个while循环在按键后立即停止。我希望它循环,直到客户端在记事本中完成写入(这时我将TOGGLE设置为false(。

您的循环进行得非常非常快。按下"A"键一秒钟意味着它将被按下数千个循环。添加一个System.Threading.Thread.Sleep(100);会使循环挂起一点。

也许这可以帮助你实现你想要的:

while (TOGGLE == false)
{
    if (Keyboard.IsKeyDown(Key.A)) { RESULT = RESULT + "A"; System.Threading.Thread.Sleep(100); }
    if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); }
    if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); }
}

另一个没有线程的解决方案。睡眠

DateTime lastAletter = DateTime.Now;
while (TOGGLE == false)
{
     if (Keyboard.IsKeyDown(Key.A) && lastAletter.AddMilliseconds(100) < DateTime.Now) { RESULT = RESULT + "A"; lastAletter = DateTime.Now; }
     if (Keyboard.IsKeyDown(Key.B)) { RESULT = RESULT + "B"; MessageBox.Show(RESULT); }
     if (Keyboard.IsKeyDown(Key.C)) { RESULT = RESULT + "C"; MessageBox.Show(RESULT); }
 }

使用KeyPress event会更有效率,请记住,while(true)需要处理器