有一个空的while循环有什么影响?

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

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

我通常喜欢

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

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

所以:

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

  • 如上所示的循环是否有任何性能影响?

谢谢!

这称为忙或旋转等待。

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

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

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

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

关于你的问题。 我相信都不应该使用。 它们在调试,性能和代码清晰度方面都存在问题。

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

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

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

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

好..

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

有其他解决方案,但不知道你的程序,很难建议。 但是,您可能希望查看IPC并且通常使用阻塞方法(在单独的线程中调用它们)而不是非阻塞。

阻塞方法会暂停您的线程并将控制权交还给操作系统,操作系统将(希望)对CPU时间执行一些有用的操作,例如将部分CPU置于hibernate状态,从而节省电力并减少热量输出。

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

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

但是如果你需要等待bool值,你可以做到

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