2

非同期ソケット サーバーがあります。クライアントに問題があり、ネットワーク イベントを再現するのが難しいために、異常な数のバイト [] が固定されるという問題が発生しました。クライアントを処理するすべてのスレッドは暗黙的であるため (私は BeginAcceptClient を使用し、明示的にインスタンス化されたスレッドの代わりにコールバックを使用します)、固定プロセスを制御しません。「暗黙的なスレッド化」とは、私が直接生成したスレッドではなく、アプリケーションをホストするランタイムによって生成されたスレッドを意味します。

とにかく、この投稿の答えは、オブジェクトの固定を解除する方法を示しています。先に進んで自分の byte[] をピン留めし、BeginRead を実行してクリーンアップ中にピン留めを外すと、舞台裏のピン留めを無効にすることは可能ですか?

ありがとう。

4

2 に答える 2

4

あなたがリンクした投稿の答えは完全に間違っています(私はそこにコメントを残しました)。最後のピン留めハンドル(より一般的には、GCHandles以外の理由があるため、「理由」のピン留め)が削除された場合にのみ、オブジェクトのピン留めが解除されます。強制的に固定を解除することはできません。それはひどく危険です。安全なマネージコードを使用して、セキュリティ上の問題でさえある安全でないことを行うことができます。

とにかく、オブジェクトの固定を防止しようとしても意味がありません。これが可能であったとしても、そうではありませんが、プロセスはランダムにクラッシュします。ソケットは、正確さをピン留めすることに依存しています。それは理由なしにこれをしません。

解決策は他にあります:

  1. アプリケーションの起動時にすべてのバッファを作成して、すべてのバッファがメモリ内で連続するようにします。バッファプールを使用します。
  2. 少数の大きなバッファーを使用し、そのセクションを個々のクライアントに割り当てます。

ちょっとした注意:ピン留めは、あなたが思っているものとは異なる方法で実装されます。固定は、オブジェクトのオンとオフを切り替えることができるフラグではありません。何かを固定すると、最初は特別なことは何も起こりません。GCが実行されている場合にのみ、GCは、固定している特別なプロパティを持つ参照があることに気付きます。次に、オブジェクトが移動するのを防ぎます。

于 2012-05-21T20:47:08.227 に答える
1

Pin/Unpin に集中する代わりに、別の AppDomain からすべてのソケット呼び出しを行うことをお勧めします。次に、「アイドル/セーフ」ポイントにいるときに、その AppDomain をアンロードして再ロードし、メモリを適切な状態にリセットできます。

于 2012-05-21T20:55:17.350 に答える