3

私のシナリオでは、多くのクライアントの tcp ソケットがサーバーに接続されています。サーバーはすべてのソケットから ReceiveAsync() を呼び出し、コールバックがエラーなしで呼び出されると、受信したデータを解析します。1 つのソケットの受信データが特定のタイプのメッセージである場合、受信コールバックはループによって他のすべてのソケットに SendAsync() を実行し、その後、再度 ReceiveAsync() を開始します。そのため、1 つのソケットに対して、他の多くのレシーバーのコールバックによって SendAsync() が非常に短時間で呼び出される可能性があります。waitone セマフォによって Sendings を同期し、送信 IO が完了した後に 1 つのセマフォを解放して、ソケットごとに 1 つの SAEA obj のみを使用できるようにしましたが、これにより、送信ループで受信者のコールバック ブロックが発生する可能性があります。そこで、セマフォをキャンセルし、各ソケットの送信メソッド用にいくつかの SAEA オブジェクトをプールしました。

もう 1 つの質問は、再利用可能な SAEA をプールすると、SAES.Buffer がメモリのフラグメントを作成するかどうかです。SAEA をプールする前に SAEA.SetBuffer(null,0,0) メソッドを呼び出すことでメモリの問題を回避できますか?

4

1 に答える 1