私は、c# でノンブロッキング ソケットを使用して、ソケット プログラミングを作成しようとしています。thisなど、私が見つけたさまざまなサンプルは while(true) ループを使用しているようですが、このアプローチでは CPU が 100% でバーストします。イベント プログラミング スタイルを使用してノンブロッキング ソケットを使用する方法はありますか? ありがとう
4 に答える
ここで MSDN の例を参照してください。この例は、データを非同期で受信する方法を示しています。Socket BeginSend/EndSend メソッドを使用して、データを非同期的に送信することもできます。
コールバック デリゲートは ThreadPool スレッドのコンテキストで実行されることに注意してください。これは、コールバック内で受信したデータを別のスレッド (Windows フォームでデータを表示するメイン UI スレッドなど) と共有する必要がある場合に重要です。lock
その場合、たとえば、キーワードを使用してデータへのアクセスを同期する必要があります。
お気づきのとおり、ノンブロッキング ソケットと while ループを使用すると、プロセッサは 100% に固定されます。非同期モデルは、送受信するデータがある場合にのみ、コールバック デリゲートを呼び出します。
負荷の高い while ループで CPU の問題を回避するため、データが受信されないthread.sleep(100)
か、またはそれ以下の場合。これにより、他のプロセスが変更されてタスクを実行できるようになります
Talking generally about blocking/non-blocking IO, applicable generally:
The key thing is that in real life your program does other things whilst not doing IO. The examples are all contrived in this way.
In blocking IO, your thread 'blocks' while waiting for IO. The OS goes and does other things, e.g. allows other threads to run. So your application can do many things (conceptually) in parallel by using many threads.
In non-blocking IO, your thread queries to see if IO is possible, and otherwise goes and does something else. So you do many things in parallel by explicitly - at an application level - swapping between them.
Socket.BeginReceive and AsyncCallback