使用Thread.Sleep在c#中的循环中每次等待一秒钟

avr*_*rum 7 c# system

我正在尝试每秒将“ p”打印到屏幕上。

当我运行这个:

while (true)
    Thread.Sleep(1000); 
    Console.WriteLine("p");
Run Code Online (Sandbox Code Playgroud)

它根本不打印。但是当我运行这个:

while (true)
    Console.WriteLine("p");
    Thread.Sleep(1000); 
Run Code Online (Sandbox Code Playgroud)

无需等待即可打印。有人可以向我解释一下并提出解决办法吗?

Fra*_*nck 13

您没有循环整个代码

这个 :

while (true)
    Thread.Sleep(1000); 
    Console.WriteLine("p");
Run Code Online (Sandbox Code Playgroud)

与此相同:

while (true)
{
    Thread.Sleep(1000); 
}
Console.WriteLine("p");
Run Code Online (Sandbox Code Playgroud)

您需要在希望循环执行的所有行周围显式设置括号,否则仅在下一条指令上循环。

您正在寻找这样的东西:

while (true)
{
    Thread.Sleep(1000); 
    Console.WriteLine("p");
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 13

为什么不戴牙套不起作用?

C#不是Python。在Python中,程序结构用空格表示。在C#中,空白完全被忽略,程序结构由语言的语法决定。

在C#中,形式的块{ any number of statements }本身就是一条语句。

的语法while

while( an expression that can be evaluated to bool ) 
    a single statement
Run Code Online (Sandbox Code Playgroud)

但是由于{ ... }单个语句,所以如果要在while,或if,或forforeach诸如此类的主体中包含多个语句,则可以使用块。

顺便说一句,您不应首先使用Thread.Sleep。仅应在测试代码中使用。线程是昂贵的程序资源。不要付钱让他们睡觉!如果要引入延迟,则有两件事要做。在事件驱动程序中,启动计时器,然后在计时器事件关闭时处理它。或者,使您的程序异步并等待Task.Delay。睡眠是一种不良习惯,表示您的程序设计中存在一些缺陷。

现在,您可能会说,嘿,这是一个控制台程序,我真的想引入我的用户体验延迟,并且我在后台没有任何事件处理,依此类推,所以为什么不睡觉呢?我可以理解这个论点。这很方便。但是,(1)还是个初学者,现在就养成良好的习惯,以后就不必破坏它们了;(2)程序会不断发展。在某个时候,您将要编写一个程序,该程序保持交互性,并在UI暂停时响应用户按键,网络流量或其他此类事件。如果您的线程处于睡眠状态,则它们不会响应这些事件。

  • @Sinatr:我的观点是,工具不会好坏。他们在实现特定目标方面的好坏。C#开发人员的目标和Python开发人员的目标是不同的,因此评估哪个更好是需要陈述一个明确的目标和一个明确的衡量标准。 (3认同)