4

これは少し「ばかげた」質問かもしれませんが、条件がfalseになるまでループしたい場合もありますが、ループを空のままにしておくのは好きではありません。だから:の代わりに

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

私は通常好む

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

しかし、私はラインで正確に何が起こるかについて少し心配していますVisible = true;冗長であっても、ランタイムはそのステートメントを実行し続けますか?このようにすることもお勧めですか?多くの「コード拡張」プラグインは、空のwhileループを好まないので、その理由がよくわかりません。

それで:

  • 空のwhileループがあることに何か問題がありますか?

  • 上記のようなループがあると、パフォーマンスに影響がありますか?

ありがとう!

4

4 に答える 4

7

これは、ビジーまたはスピン待機と呼ばれます。

主な問題は、このwhileループを実行しているスレッドをブロックしていることです。このスレッドがGUIスレッドの場合、GUIがフリーズして無責任になります。そして、はい、これはパフォーマンスの低下につながります。コンパイラもOSも、これをwhileループで最適化できるかどうかを知ることができないためです。

このようにシングルループを作成してみて、CPUの1つのコアが100%でどのように実行されているかを確認してください。

これを行う正しい方法は、非同期プログラミングを使用することです。非同期プログラミングでは、前の操作の実行が終了したときに、イベントまたは言語構成(awaitなど)のいずれかによってコードが通知されます。

ただし、通常、低レベルのシステムまたは言語で使用されます。.NET 4.0では、効率的なスレッドシンクロナイゼーションとして機能するSpinWaitコンストラクトが導入されています。

そしてあなたの質問に関連して。どちらも使うべきではないと思います。これらは両方とも、デバッグ、パフォーマンス、およびコードの明確さの両方に問題があります。

于 2012-08-04T14:17:49.573 に答える
1

これを行うのは良い考えではありません。アプリケーションを起動し、このループに入ったら、タスクマネージャーでCPU使用率を確認します。CPUコアの1つがフルキャパシティーで実行されていることに気付くでしょう。これは、エネルギーが浪費されていることを意味し、実行する必要のある他のいくつかのプログラムは、可能な限り多くのCPU時間を持っていないでしょう。

これを回避する方法はいくつかあります。ここでの最も簡単な解決策は、次のように、各ループパス内でスレッドを数ミリ秒スリープ状態にすることです。

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

より良い解決策は、プログラムが正確に何をしているかによって異なります。AutoResetEvent別のスレッドに何かをロードしている場合は、を使用するか、ロックまたは他のスレッド同期メカニズムを使用する方がよい場合があります。

于 2012-08-04T14:18:16.290 に答える
1

メイン(UIスレッド)では実行しないでください。イベントを検索または作成してみてください(例:IsRunningChanged)。

スレッドで何かを待つ必要がある場合は、EventWaitHandlehttp://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は冗長ステートメントを実行します
  • いいえ、そのようなことをするべきではありません。CPUを100%使用しているので、役に立ちません。

別の解決策もありますが、プログラムを知らなければアドバイスするのは難しいです。ただし、 IPCを調べて、非ブロッキングではなく、通常はブロッキングメソッド(別々のスレッドで呼び出す)を使用することをお勧めします。

ブロッキングメソッドはスレッドを一時停止し、オペレーティングシステムに制御を戻します。これにより、CPUの一部をスリープ状態にしたり、電力を節約したり、熱出力を減らしたりするなど、CPU時間に役立つことができます。

于 2012-08-04T14:25:35.553 に答える