4

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

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

我通常更喜欢

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

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

所以:

  • 有一个空的while循环有什么问题吗?

  • 有一个如上所示的循环是否会对性能产生影响?

谢谢!

4

4 回答 4

7

这称为忙或旋转等待。

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

只需尝试像这样进行单循环,看看你的 CPU 的一个核心是如何以 100% 运行的。

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

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

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

于 2012-08-04T14:17:49.573 回答
1

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

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

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

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

于 2012-08-04T14:18:16.290 回答
1

不要在主(UI 线程)中执行此操作。尝试查找或制作事件(例如 IsRunningChanged)。

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

但是,如果您需要等待布尔值,您可以这样做

while(IsRunning)
{
    Thread.Sleep(10);
}
于 2012-08-04T14:20:51.903 回答
1

出色地..

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

有替代解决方案,但在不了解您的程序的情况下很难给出建议。但是,您可能想研究IPC并通常使用阻塞方法(在单独的线程中调用它们)而不是非阻塞方法。

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

于 2012-08-04T14:25:35.553 回答