我正尝试每秒在屏幕上打印“ p”。
运行此命令时
while (true)
Thread.Sleep(1000);
Console.WriteLine("p");
它根本不打印。 但是当我运行它时:
while (true)
Console.WriteLine("p");
Thread.Sleep(1000);
无需等待就可以打印。有人可以向我解释一下并提出解决方法吗?
我正尝试每秒在屏幕上打印“ p”。
运行此命令时
while (true)
Thread.Sleep(1000);
Console.WriteLine("p");
它根本不打印。 但是当我运行它时:
while (true)
Console.WriteLine("p");
Thread.Sleep(1000);
无需等待就可以打印。有人可以向我解释一下并提出解决方法吗?
您不会循环整个代码
此:
while (true)
Thread.Sleep(1000);
Console.WriteLine("p");
与此相同:
while (true)
{
Thread.Sleep(1000);
}
Console.WriteLine("p");
您需要在希望循环执行的所有行周围显式设置花括号,否则仅在下一条指令上循环。
您正在寻找类似这样的东西
while (true)
{
Thread.Sleep(1000);
Console.WriteLine("p");
}
,
为什么没有括号就不能工作?
C#不是Python。在Python中,程序结构用空格表示。在C#中,空白完全被忽略,程序结构由语言的语法决定。
在C#中,{ any number of statements }
形式的块本身就是一条语句。
while
的语法是
while( an expression that can be evaluated to bool )
a single statement
但是由于{ ... }
是一条语句,因此如果您想在while
,if
或{{1} }或for
等,您使用了一个块。
顺便说一句,您不应该首先使用Thread.Sleep 。仅应在测试代码中使用。线程是昂贵的程序资源。不要付钱让他们睡觉!如果要引入延迟,则有两件事要做。在事件驱动程序中,启动计时器,然后在计时器事件关闭时处理它。或者,使您的程序异步并等待foreach
。睡眠是一种不良习惯,表明您的程序设计中存在某些缺陷。
现在,您可能会说,嘿,这是一个控制台程序,我确实想引入我的用户体验延迟,并且我在后台没有任何事件处理,依此类推,所以为什么不睡觉?我可以理解这个论点。这很方便。但是,(1)还是个初学者,现在就养成良好的习惯,以后就不必破坏它们了;(2)程序会不断发展。在某个时候,您将要编写一个程序,该程序保持交互性,并在UI暂停时响应用户按键,网络流量或其他此类事件。如果您的线程处于睡眠状态,则它们不会响应这些事件。