2009-11-03 9 views
6

私はちょうどC#のノンブロッキングソケットを使用して、いくつかのソケットプログラミングをしようとしています。 thisのような、私が見つけたさまざまなサンプルは、while(true)ループを使用しているようですが、この方法ではCPUが100%でバーストします。 イベントプログラミングスタイルを使用してノンブロッキングソケットを使用する方法はありますか? おかげwhile(真)ループなしのC#ノンブロッキングソケット

答えて

6

は、MSDNの例hereを参照してください。この例は、データを非同期で受信する方法を示しています。また、Socket BeginSend/EndSendメソッドを使用してデータを非同期で送信することもできます。

コールバックデリゲートは、ThreadPoolスレッドのコンテキストで実行されることに注意してください。これは、コールバック内で受信したデータを別のスレッド、たとえばWindowsのフォームでデータを表示するメインのUIスレッドと共有する必要がある場合に重要です。そのような場合は、たとえば、lockキーワードを使用してデータへのアクセスを同期する必要があります。

ノンブロッキングソケットとwhileループで気付いたように、プロセッサは100%で固定されています。非同期モデルは、送信または受信するデータがある場合にのみコールバックデリゲートを呼び出します。

3

は、一般的に適用可能なIOを、非ブロック/ブロックについて、一般的に話す:

重要なのは、実際の生活の中であなたのプログラムがIOをしていないながら他のものをないことです。これらの例はすべてこのように考案されています。

IOをブロックする際、スレッドはIOを待機している間にブロックされます。 OSは他のものに移行します。他のスレッドを実行できます。したがって、多くのスレッドを使用することで、アプリケーションは(概念的に)多くのことを並行して実行できます。

ノンブロッキングIOでは、スレッドはIOが可能かどうかを確認し、それ以外の場合は何かを実行します。つまり、アプリケーションレベルで明示的に多くのことを並列処理します。

+0

この回答は、なぜ非ブロッキングIOをしたいのかについての理論を示していますが、実際に実装する方法に関するポスターの質問には答えません。 – squawknull

0

Socket.BeginReceiveとAsyncCallback

4

重いwhileループでCPUの問題を回避するには、データが受信されない場合はthread.sleep(100)以下を入力します。これにより、他のプロセスが自分の仕事を行うために変更されます