私はいくつかの非同期tcpサーバーコードで、システム全体のメモリを消費するエラーが発生することがあります。ログ、イベントビューア、およびいくつかの "MS docs"を見ると、 "呼び出し元のアプリケーションが同じクライアントに複数の非同期IOコールを複数回送信すると、リモートクライアントがI/Oの終了を停止するとヒープフラグメンテーションとプライベートバイトが増加することがあります。 O "を使用すると、System.Threading.OverlappedData構造体とバイト配列のメモリ使用量と固定量が増加します。非同期tcp .NETコードがシステムリソース全体を使い果たしてしまうのを防ぐ方法
KB記事で提案されている解決策は、「非同期IOで未送信バッファ(送信または受信)の上限を設定する」ことです。
どうすればよいですか?これはBeginReadに送られるbyte []を参照していますか?だから、解決策は単にセマフォを使ってアクセスバイト[]をラップしますか?
EDIT:バイトバッファへのセマフォ制御のアクセス、または静的なサイズのバイトバッファプールの2つの共通の解決策があります。私がまだ残っている懸念は、この非同期クライアントの問題が発生したとき(セマンフォーまたはバイトバッファープールを持つことによって実際には変わったネットワークイベントが発生する)、メモリが不足するのを防ぐことができますが、問題は解決しないということです。バッファーの私のプールは、問題のクライアントが実際に正当な機能を持つクライアントをロックしてしまう可能性があります。
編集2:この偉大な間に来たanswer。基本的には、手動でオブジェクトを固定解除する方法を示しています。また、非同期TCPコードはシーンランタイムルールの背後に固定されていますが、使用する前に明示的に各バッファを固定し、ブロックの最後または最後に固定解除することでオーバーライドできます。私は今それを理解しようとしています...
可能な複製:http://stackoverflow.com/questions/236171/net-does-not-have-reliable-asynchronouos-socket-communication – Dennis
これはセマフォを使用してBeginReadへの呼び出しをラップする方法です。 – mikalai
これはコードをプロファイリングするのに十分な理由かもしれません... – gsscoder