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(。
因为当消息框出现时,您正在阻止循环,但对于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)
需要处理器