私が持っているいくつかの非同期TCPサーバーコードでは、プロセスがシステムのメモリ全体を消費する原因となるエラーが発生することがあります。ログ、イベントビューア、および一部のMSドキュメントを見ると、「呼び出し元のアプリケーションが同じクライアントに対して非同期IO呼び出しを複数回行うと、リモートクライアントがIの終わりを停止すると、ヒープの断片化とプライベートバイトの増加が見られる場合があります。 / O "。これにより、メモリ使用量が急増し、System.Threading.OverlappedData構造体とバイト配列が固定されます。
KBの記事で提案されている解決策は、「非同期IOで未処理の(送信または受信の)バッファーの量に上限を設定する」ことです。
どのようにこれを行うのですか?これは、BeginReadに送信されるbyte []を参照していますか?では、ソリューションは単にアクセスバイト[]をセマフォでラップするだけですか?
編集:バイトバッファへのセマフォ制御アクセス、またはバイトバッファの静的サイズのプールを持つことは2つの一般的な解決策です。セマフォまたはバイトバッファプールがあると、この非同期クライアントの問題が発生したときに(実際には奇妙なネットワークイベントである可能性があります)、メモリが不足するのを防ぐことができますが、問題は解決しません。私のバッファのプールは、問題のあるクライアントによって飲み込まれ、事実上、正しい機能の正当なクライアントをロックアウトする可能性があります。
編集2:この素晴らしい答えに出くわしました。基本的に、オブジェクトの固定を手動で解除する方法を示しています。非同期TCPコードは、実行時ルールの舞台裏にピン留めを残しますが、使用前に各バッファーを明示的にピン留めし、ブロックの最後または最後にピン留めを解除することで、これをオーバーライドできる場合があります。私は今それを理解しようとしています...