空while循环的效果是什么

本文关键字:是什么 while 循环 | 更新日期: 2024-10-24 20:33:56

我知道这可能是一个有点"愚蠢"的问题,但有时,我只想循环,直到条件为假,但我不喜欢保持循环为空。因此而不是

Visible = true;
while(IsRunning)
{
}
Visible = false;

我通常更喜欢

while(IsRunning)
{
    Visible = true;
}
Visible = false;

然而,我有点担心Visible = true;行到底发生了什么。运行时是否继续执行该语句,即使它是冗余?这样做是否明智?许多"代码增强"插件不喜欢while循环为空,我真的不明白为什么。

SO:

  • 空while循环有什么问题吗

  • 具有如上所示的循环是否会对性能产生任何影响

谢谢!

空while循环的效果是什么

这被称为忙或旋转等待。

主要的问题是,您阻塞了正在运行while循环的线程。如果这个线程是GUI线程,那么它将导致GUI冻结和不响应。是的,这会导致性能损失,因为无论是编译器还是操作系统都不知道他们是否能以某种方式优化while循环。

试着做这样的单循环,看看CPU的一个核心是如何100%运行的。

正确的方法是使用异步编程,在异步编程中,当上一个操作完成运行时,您的代码会通过事件或语言构造(如wait)得到通知。

但它通常用于低级系统或语言中。NET 4.0引入了SpinWait结构,作为高效的线程同步。

关于你的问题。我认为两者都不应该使用。它们对调试、性能和代码的清晰度都有问题。

这样做不是一个好主意。启动应用程序,当它进入这个循环时,查看任务管理器中的CPU使用情况。您会注意到其中一个CPU核心将满负荷运行。这意味着能量正在被浪费,而其他一些可能需要执行的程序将没有那么多的CPU时间。

有几种方法可以解决这个问题。这里最简单的解决方案是在每个循环过程中让线程休眠几毫秒,如下所示:

Visible = true;
while(IsRunning)
{
    Thread.Sleep(50 /* millisec */);
}
Visible = false;

一个更好的解决方案将取决于你的程序到底在做什么。如果它正在另一个线程中加载一些东西,那么最好使用AutoResetEvent,或者通过锁定或其他线程同步机制。

嗯。。

  • 是的,空while循环通常会被视为一件坏事,尽管也有一些有用的情况
  • 是的,CPU将执行您的冗余语句
  • 不,你不应该做那样的事。它使用了100%的CPU,这是没有用的

有其他解决方案,但如果不了解您的程序,很难提供建议。然而,您可能希望研究IPC,并通常使用阻塞方法(在单独的线程中调用它们)而不是非阻塞方法。

阻塞方法会暂停线程并将控制权交还给操作系统,操作系统(希望)会在CPU时间内做一些有用的事情,比如让部分CPU进入睡眠状态,节省电源并减少热量输出。

不要在main(UI线程)中执行。尝试查找或生成事件(例如IsRunningChanged)。

如果您需要在线程中等待,最好使用EventWaitHandlehttp://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.eventwaithandle.aspx

但如果你需要等待布尔值,你可以做

while(IsRunning)
{
    Thread.Sleep(10);
}