我一直在阅读.NET异步套接字所具有的各种内存管理问题。
只有少数几个链接,但抓住这个链接会让你全部: http://codebetter.com/blogs/gregyoung/archive/2007/06/18/async-sockets-and-buffer-management.aspx
基本上
当套接字异步发送/接收许多小字节[]的时
发送/接收字节[]被固定在存储器中
导致分裂。
为了创建缓冲区管理器的目的: 我有一个托管缓冲区(byte [])
byte[] managedBuffer = new byte[1024];
// do stuff with managedBuffer;
如何通过引用将此byte []发送到套接字的异步.BeginSend()方法?
// 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 :(得分:2)
数组总是通过引用传递,所以你已经这样做了。如果您异步使用套接字,那么您需要确保在进行中时不使用managedBuffer。
答案 1 :(得分:2)
数组总是作为引用传递(比如传递指针)。
答案 2 :(得分:2)
如Nik所示,当您将byte[]
传递给方法时,您已经通过引用传递了它。但是,使用您在文档中找到的ArraySegment
方法有一些好处;它们主要是为了避免在异步调用期间固定byte[]
缓冲区中固有的内存碎片问题。
有关详情,请参阅我对How to write a scalable Tcp/Ip based server的回答。
答案 3 :(得分:1)
BeginSend对字节数据的唯一作用是将其发送到打开的Socket。之后,字节数组将被放置(在函数的末尾,或者当定义数组的类被释放时),就像GC中的任何其他字节数组一样。