BeginSend<;IList<;ArraySegment..)是否执行所有ArraySegments的原子发
本文关键字:lt ArraySegments 是否 ArraySegment IList BeginSend 执行 | 更新日期: 2023-09-27 18:01:08
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类来管理缓冲池。池及其缓冲区在实例化此类时创建,在垃圾回收回收缓冲池时销毁。每次需要使用缓冲区时,都会从池中取出一个缓冲区,使用它,并在完成后将其返回到池中。这个过程比每次需要使用缓冲区时创建和销毁缓冲区要快得多。
BufferManager只是一种方便的方法,可以避免调用new[],然后等待GC销毁块。发送完这些块后,请确保调用BlockManager。ReturnBuffer,或者这些字节将不可用于未来的消息,并且将一直逗留到BufferManager本身GC’d。如果它将使用实时的BufferManager,并且您正在使用这些缓冲区发送大量消息,那么您可能会泄漏大量内存。