.NET中的Socket类公开以下方法:
Socket.BeginSend Method (IList<ArraySegment<Byte>>, SocketFlags, AsyncCallback, Object)
Run Code Online (Sandbox Code Playgroud)
我有一个BufferManager类,返回ArraySegment<byte>指定的,常量大小为2kB.现在我有一条要发送的消息,假设它是10kB大,所以我可以使用5个预先分配的缓冲区来存储此消息并调用Socket.BeginSend(IList<ArraySegment>>...).这个消息是否会以原子方式发送,就像我刚才使用的那样byte[](即几个并行的BeginSend操作不会混合远程站点上的消息)?
编辑:澄清 - 我正在使用TCP/IP套接字,我的程序同时从几个线程调用BeginSend.假设我们有两个数组段列表:
L1:a1 a2 a3
L2:b1 b2 b3
现在我同时从两个线程调用BeginSend(L1 ...)和BeginSend(L2 ...).我想知道这两个列表是否会在远程端混合,我不会读取类似的内容:a1 b1 b2 a2 b3 a3.
BufferManager 所做的就是维护一组固定的内存块供您使用。BufferManager 对字节的并发性或它们的使用方式没有任何影响。来自 MSDN 文档:
您可以使用 BufferManager 类来管理缓冲池。池及其缓冲区在实例化此类时创建,并在垃圾收集回收缓冲池时销毁。每次需要使用缓冲区时,您都会从池中取出一个缓冲区,使用它,然后在完成后将其返回到池中。这一过程比每次需要使用缓冲区时创建和销毁缓冲区要快得多。
BufferManager 只是一种避免调用 new[] 并等待 GC 销毁块的便捷方法。发送完这些块后,请确保调用 BlockManager.ReturnBuffer,否则这些字节将无法用于将来的消息,并且会一直徘徊,直到 BufferManager 本身被 GC 回收为止。如果它与 BufferManager 一起存在,并且您使用这些缓冲区发送大量消息,则可能会泄漏大量内存。