2009-05-29 13 views
0

.NET非同期ソケットにはさまざまなメモリ管理の問題があります。どのようにSystem.Net.Sockets.Send()のバッファとしてbyte []参照を渡すかRecieve()

ありますが、リンクの一握りは、この1をスパイダリングすると、すべてのあなたにそれらを取得します:基本的に http://codebetter.com/blogs/gregyoung/archive/2007/06/18/async-sockets-and-buffer-management.aspx


ソケットが非同期で送信しているとき/受ける多くの小さなバイト[]さん
送受信バイト[]はメモリ
に固定され、断片化します。バッファマネージャを作成する目的のためにSO

: 私はにより、ソケットの非同期.BeginSend()メソッドに[]このバイトを送ってくださいどのように管理するバッファ(バイト[])

byte[] managedBuffer = new byte[1024]; 
// do stuff with managedBuffer; 

を持っています参照?

// I don't want to pass the VALUE to the method, but a reference 
// to managedBuffer; 
System.Net.Sockets.Socket.BeginSend(managedBuffer...(other params)); 
+0

あなたが参照しているメモリ管理の問題へのリンクを投稿できますか? –

+0

@Jon B - 完了 - お楽しみください - それは私のために新しい世界を開いた! – divinci

+0

@divinci - 面白い読み込み。彼は通常の配列の代わりにArraySegmentを推薦しているようだ。 –

答えて

2

Nikによって示されているように、byte[]をメソッドに渡すと、すでに参照しているとします。ただし、ドキュメントにあるArraySegmentメソッドを使用する利点があります。非同期呼び出しの間にバッファーの固定に固有のメモリー断片化の問題を回避することが主な目的です。

詳細はHow to write a scalable Tcp/Ip based serverを参照してください。

2

配列は常に参照渡しであるため、すでにそれを行っています。ソケットを非同期で使用している場合は、進行中にmanagedBufferを使用しないようにする必要があります。

1

BeginSendがバイトデータで行う唯一のことは、開いているSocketに送ることです。その後、バイト配列は配置されます(関数の終わりに、または配列が定義されているクラスが配置されると、GCによって他のバイト配列と同じように.NETに配置されます)。

2

配列は常に(ポ​​インタを渡すなどの)参照として渡されます。

関連する問題