BeginSend

时间:2011-07-04 08:36:54

标签: c# .net sockets

.NET中的Socket类公开了以下方法:

Socket.BeginSend Method (IList<ArraySegment<Byte>>, SocketFlags, AsyncCallback, Object)

我有一个BufferManager类,它返回指定的常量大小为2kB的ArraySegment<byte>。现在我有一条要发送的消息,假设它是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。

1 个答案:

答案 0 :(得分:1)

所有BufferManager都会维护一组固定的内存块供您使用。 BufferManager对字节的​​并发性没有任何影响,或者无论如何都不会影响字节的使用。从MSDN文档:

  

您可以使用BufferManager类来管理缓冲池。当您实例化此类时会创建池及其缓冲区,并在垃圾收集回收缓冲池时将其销毁。每次需要使用缓冲区时,从池中取一个缓冲区,使用它,完成后将其返回池中。每次需要使用缓冲区时,此过程比创建和销毁缓冲区要快得多。

BufferManager只是避免调用new []然后等待GC销毁块的一种方便方法。完成发送这些块后,请确保调用BlockManager.ReturnBuffer,否则这些字节将不可用于将来的消息,并将一直持续到您的BufferManager本身为GC。如果它将继续使用BufferManager,并且您使用这些缓冲区发送大量消息,则可能会泄漏大量内存。