一方無しC#の非ブロッキングソケット(真)ループ
-
13-09-2019 - |
質問
私はC#で、非ブロッキングソケットを使用して、いくつかのソケットプログラミングを作るしようとしています。 このようとして私が見つけた様々なサンプル、このには、ように見えます(真)whileループを使用するが、このアプローチは100%で破裂するようにCPUを引き起こします。 イベントのプログラミングスタイルを使用して、非ブロッキングソケットを使用する方法はありますか? おかげ
解決
ここのMSDNの例を参照してください。例では、非同期にデータを受信する方法を示しています。また、非同期でデータを送信するためにソケットBeginSend / EndSendメソッドを使用することができます。
あなたは、コールバックデリゲートは、ThreadPoolのスレッドのコンテキストで実行されることに注意してください。コールバックの内部に受信したデータが別のスレッド、例えば、Windowsフォームにデータを表示するメインUIスレッドと共有する必要がある場合、これは重要です。もしそうなら、あなたは例えば、lock
キーワードを使用したデータへの同期アクセスにする必要があります。
、ノンブロッキングソケットとwhileループで、プロセッサが100%で釘付けになります。送信または受信するデータがある場合、非同期モデルが唯一のコールバックデリゲートを呼び出します。
他のヒント
thread.sleep(100)
以下を受け取っていない場合、、重いwhileループでCPUの問題を回避するには。それは他のプロセスがそのタスクを実行するために変更できます。
一般的に適用可能なIOを、非ブロック/ブロックについて、一般的に話します:
重要なのは、実際の生活の中であなたのプログラムがないことであるの他の事のIOをしていないながら。例はすべて、このように工夫されています。
IOをブロックでは、あなたのスレッドのブロックは、 "IOを待っている間に。 OSは、例えば、他のことを行くとい他のスレッドが実行できるようになります。だからあなたのアプリケーションは多くのスレッドを使用して並列に多くのことを(概念的に)行うことができます。
IOが可能であり、そうでない場合は行くと何かを行いますかどうかを確認するために、あなたのスレッドのクエリをIOを非ブロックで。だから、明示的で並列に多くのことを行う - アプリケーションレベルで - それらの間で交換する。
。Socket.BeginReceiveとAsyncCallback