イベントにリッスンしながら、いつも開いておきたいコンソールアプリケーションがあります。私はThread.Sleep(Timeout.Infinite);
とwhile (true) { }
をテストしており、両方ともコンソールアプリケーションを開いたままでイベントを発生させることができます。私はもう一方の上で使用しなければならないものがありますか?スレッドがスリープしている場合、クラスのスコープで宣言された静的コレクションを変更するなど、何もしてはいけないことはありますか?はThread.Sleep(Timeout.Infinite)です。 while(true){}よりも効率的ですか?
答えて
私はManualResetEvent
(または他のWaitHandle
)を使用して、およびManualResetEvent.WaitOneを呼び出すことをお勧めします。
これは、(イベントにSet()
を呼び出すことにより)必要なときに、それはあなたの無限の「ブロック」から出るにクリーンな方法を提供することを除いて、いつまでも寝てと同様の効果を持つことになります。
while(true)
を使用すると、CPUサイクルが消費されるため、避けるべきことは間違いありません。
クラスのスコープで宣言された静的コレクションを変更するなど、何もしてはいけないことはありますか?
一般に、スレッドがブロックされるため、共有データの使用に関する同期上の問題は発生しません(ただし、コレクション内のアイテムには、適切な同期コンテキストを持つスレッドで使用する必要があるユーザーインターフェイス要素など、特定の要件はありません。)
while(true)...
とは異なり、Thread.Sleep
はCPUサイクルを使用しないため、この意味でスリープが効率的です。一般的にspinlocksの外部のBusy Waitingを使用することはお勧めしません。
スレッドがスリープしている場合は、何もしないでください。
あなたのスレッドはThread.Sleep
に入った時点でブロックされているので、あなたがリソースにしたいことは何でも公正なゲームです。よりスマートな方法でsleep()
作品ながら
おかげで、私は私がやって達成しようとして人々に推奨されているwhileループを見てきましたし、それはそれについて移動するための正しい方法だった場合、私はわかりませんでした。 – Lunyx
はい、 while(true)
はCPUを消費します: sleep()
機能がスリープ状態に現在の実行コンテキストを置きます。それは
(c)を睡眠として現在のプロセスがウェイクアップタイマーが起動されるまで待機する(b)のマークアトミック
(a)は、ウェイクアップタイマー
を設定カーネルスリープ機能を呼び出すためにシステムコールを呼び出すことによってこれを行い、または割り込みが発生する
sleep()
に電話すると、CPUは他の作業を行うことができます。
これがsleep()
が便利な理由の1つです。
便利なリンク - Be careful when using Sleep
私は
Thread.Sleep(Timeout.Infinite);
が実際にOSネイティブのスケジューラの助けを借りて、スリープ状態にスレッドを取得wheareasスレッドは、停止したことがないので、コール
while (true) { ... }
は、計算集約的であると思います。そしてスレッドが実際に停止するので、計算量が少なくて済むと思います。
あなたの答えには不確かさがあるようです... "私は思う"、 "私が思う"など –
私は答えについて確信していましたが、私はちょうど私が "考えている" "予防のために。 :) – leoismyname
Thread.Sleepメソッドを呼び出すと、現在のスレッドは、メソッドに渡されたミリ秒数または時間間隔の間すぐにブロックされ、残りのタイムスライスが別のスレッドに渡されます。
https://msdn.microsoft.com/en-us/library/tttdef8x(v=vs.110).aspx
- 1. Thread.sleep()での効率
- 2. Datatableよりも効率的
- 3. コードよりも効率的なコードは何ですか?
- 4. OkioはなぜBufferedInputStreamとBufferedOutputStreamよりも効率的ですか?
- 5. XML :: Twig:parsefile()はparse()よりも効率的ですか?
- 6. BoundStatementはCassandraのSimpleStatementよりも効率的ですか?
- 7. Javaでwhileループをミキシングするのは効率的ですか?
- 8. より効率的なスクリプトですか?
- 9. より効率的なソリューションですか?
- 10. String.SplitよりもString.Substringの方が効率的ですか?
- 11. glMultMatrix/glLoadMatrixよりもglRotatef、またはglTranslatefより効率的ですか?
- 12. バブルソートよりも効率的なソートアルゴリズム
- 13. イテレータをインクリメントする:++ ++よりも効率的です++?
- 14. はX^n(1/n)よりも効率的ですか? (nは整数)
- 15. LINQクエリまたはSQLクエリ。より効率的なものは何ですか?
- 16. mysqlでは、ストアドプロシージャはより効率的ですか?
- 17. forループはC++でより効率的ですか?職場で
- 18. なぜパラメータベースの定義は再帰よりも効率的ですか?
- 19. http Apache基本認証 - より効率的なものは何ですか?
- 20. ループはレクサーの正規表現よりも効率的ですか?
- 21. Whileループはforループより効率的です。理由は何でしょうか?
- 22. getまたはbasename()はより効率的ですか?
- 23. sendRedirectまたはリクエストディスパッチはより効率的ですか?
- 24. このように文字列を効率的に切り替える方法はありますか?より効率的なものはありますか?
- 25. Celeryはローカルシステムで効率的ですが、Pythonのマルチプロセッシングは効率的ですか?
- 26. LL(1)パーサーはプレフィックスのエンコーディングで効率的ですが、LR(1)はより効率的です。
- 27. どちらがより効率的で、atan2かsqrtですか?
- 28. varcharフィールド - 2の威力はより効率的ですか?
- 29. は、より効率的なポイントフリーコードですか?
- 30. anti-joinは、左外部結合より効率的ですか?
私は実際にそれがすべて終了することを望んでいませんが、退出する方法を持っていることを望む人がいる場合に私はあなたの答えを受け入れます。 – Lunyx
@ダニエルそれはあなたが特定の時点で望む何かではないにしても、あなたのプログラムがシャットダウン*するためのきれいな方法を持っていることは素晴らしいことです;)私はまだ睡眠以上にこのアプローチを使用して、個人的に –
プログラムが終了する唯一の時間がマシンの再起動時である場合、ManualResetEventの使用方法はThread.Sleep()とどのように異なるでしょうか? – Lunyx