私はちょうどC#のノンブロッキングソケットを使用して、いくつかのソケットプログラミングをしようとしています。 thisのような、私が見つけたさまざまなサンプルは、while(true)ループを使用しているようですが、この方法ではCPUが100%でバーストします。 イベントプログラミングスタイルを使用してノンブロッキングソケットを使用する方法はありますか? おかげwhile(真)ループなしのC#ノンブロッキングソケット
答えて
は、MSDNの例hereを参照してください。この例は、データを非同期で受信する方法を示しています。また、Socket BeginSend/EndSendメソッドを使用してデータを非同期で送信することもできます。
コールバックデリゲートは、ThreadPoolスレッドのコンテキストで実行されることに注意してください。これは、コールバック内で受信したデータを別のスレッド、たとえばWindowsのフォームでデータを表示するメインのUIスレッドと共有する必要がある場合に重要です。そのような場合は、たとえば、lock
キーワードを使用してデータへのアクセスを同期する必要があります。
ノンブロッキングソケットとwhileループで気付いたように、プロセッサは100%で固定されています。非同期モデルは、送信または受信するデータがある場合にのみコールバックデリゲートを呼び出します。
は、一般的に適用可能なIOを、非ブロック/ブロックについて、一般的に話す:
重要なのは、実際の生活の中であなたのプログラムがIOをしていないながら他のものをないことです。これらの例はすべてこのように考案されています。
IOをブロックする際、スレッドはIOを待機している間にブロックされます。 OSは他のものに移行します。他のスレッドを実行できます。したがって、多くのスレッドを使用することで、アプリケーションは(概念的に)多くのことを並行して実行できます。
ノンブロッキングIOでは、スレッドはIOが可能かどうかを確認し、それ以外の場合は何かを実行します。つまり、アプリケーションレベルで明示的に多くのことを並列処理します。
Socket.BeginReceiveとAsyncCallback
重いwhileループでCPUの問題を回避するには、データが受信されない場合はthread.sleep(100)
以下を入力します。これにより、他のプロセスが自分の仕事を行うために変更されます
- 1. 中断のないwhile(真の)ループ
- 2. whileループは常に真となります。C++
- 3. C++ switch while default whileループ
- 4. whileループwhile a C++関数
- 5. while(真)は等しくないwhile(!false)
- 6. Stringstream C++ whileループ
- 7. C do-whileループ
- 8. C++ do-whileループ
- 9. C++ cin.fail()whileループ
- 10. whileループに関するcプログラミングで真または偽
- 11. C#while while whileループを再起動
- 12. whileループが終了しないC++
- 13. whileループがboolでブレークしないC#
- 14. Infinite Whileループが動作しないC++
- 15. C#foreach inside whileループ
- 16. C++ 'switch'と 'while'ループ
- 17. C#DO Whileループ - Hangman
- 18. 略語C whileループ
- 19. whileループwhileループwhileループ
- 20. whileループの不思議なバグ(C++)
- 21. バッチアップロードのwhileループwhile mysqli結果なし
- 22. do whileループが正しくループしていない&C++
- 23. C - Whileループの複製プリントステートメント
- 24. C++ do whileループのアドバイス
- 25. whileループ内のセグメンテーションフォールト(C)
- 26. Cでループしていないネストされたwhileループ
- 27. if文がwhile(真)ループで実行されていない
- 28. C#whileループ内のif条件に対してwhileループを終了します。
- 29. whileループwhileループwhileループより高速
- 30. A Whileループwhileループwhileループ - SQL
この回答は、なぜ非ブロッキングIOをしたいのかについての理論を示していますが、実際に実装する方法に関するポスターの質問には答えません。 – squawknull