.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。

最佳答案

BufferManager所做的只是维护一组固定的内存块供您使用。 BufferManager不会影响字节的并发性,也不会影响字节的使用方式。从MSDN文档中:



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

10-07 19:59