- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
传递 ArraySegment<byte>
的列表 背后的原因是什么?至 Socket.BeginReceive
/SocketAsyncEventArgs
?
MSDN for the Socket.BeginReceive
constructor甚至没有正确描述第一个参数):
public IAsyncResult BeginReceive(
IList<ArraySegment<byte>> buffers,
SocketFlags socketFlags,
AsyncCallback callback,
object state
)
Paremeters:
buffers
Type:System.Collections.Generic.IList<ArraySegment<Byte>>
An array of typeByte
that is the storage location for the received data.
...
我以为主要思路是在Large Object Heap上分配一个大缓冲区,然后把这个缓冲区的一段传给Socket.BeginReceive
,以避免将小对象固定在堆周围并扰乱 GC 的工作。
但为什么我要将几个段传递给这些方法?如果是SocketAsyncEventArgs
,这似乎会使这些对象的池化变得复杂,我看不出这背后的原因。
最佳答案
我在 this question 中发现了什么在 MSDN 中:
BeginReceive
有一个重载版本,它接受一个字节数组。当它已满或已收到数据包时(逻辑上是按顺序排列的),将触发回调。
正如我链接的答案中所述:
Reads can be multiples of that because if packets arrive out of order all of them are made visible to application the moment the logically first one arrives. You get to read from all contiguous queued packets at once in this case.
这意味着:如果传入的数据包乱序(即序列号高于预期),它将被阻止。一旦丢失的数据包到达,所有可用的数据包都会写入您的列表,并且只会触发一个回调,而不是为所有可用的数据包一遍又一遍地触发回调,每个数据包都会填充您的缓冲区等等。
这意味着,此实现通过在数组列表中提供所有可用数据包来节省大量开销,仅调用回调一次,而不是从网络堆栈到缓冲区执行大量内存复制,并且反复给你回电。
关于garbage-collection - BeginReceive/SocketAsyncEventArgs ArraySegments 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42699348/
.NET 中的 Socket 类公开了以下方法: Socket.BeginSend Method (IList>, SocketFlags, AsyncCallback, Object) 我有一个返回
我一直在寻找方法来返回基本上由 ArraySegment 在偏移量和计数方面持有的段。尽管 ArraySegment 拥有完整的原始数组,但它只是将其分隔,因为对段的任何更改都会反射(reflect)
我刚刚遇到 ArraySegment在子类化 MessageEncoder 时键入类。 我现在明白它是给定数组的一段,有一个偏移量,不可枚举,也没有索引器,但我仍然不明白它的用法。有人可以举例说明吗?
我刚刚查看了 .NET Core 中的 ArraySegment 类 (...\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\System .Runtim
bool MemoryStream.TryGetBuffer(out ArraySegment buffer) 是 .NET 4.6 中的一个新 API,可用于访问存储在 MemoryStream 中
传递 ArraySegment 的列表 背后的原因是什么?至 Socket.BeginReceive/SocketAsyncEventArgs ? MSDN for the Socket.BeginR
我已阅读 Protobuf-net memcache provider fails on append/set ArraySegment这表示它可能在某些时候得到支持。 我也试过那个问题提示的测试,2
我想解决这个问题, 我想使用 ArraySegment 传输 Json 对象 我的 JSON 数据是以这种格式 {"employees":[ {"firstName":"John", "las
我正在研究返回的最佳方式' views ' 放入一个非常大的数组中,发现 ArraySegment这完全符合我的需求。然而,我随后发现 Memory这似乎表现得一样,除了需要一个跨度来查看内存。 对于
随着 C# 7.2 中 Memory、Span 和 ArraySegment 的引入,我想知道是否可以将非托管数组表示为可枚举数组对象,存在于堆中。 后一个要求排除了 Span,它基本上实现了我想要的
我一直在寻找实现一个自定义类: IList> 这将被传递给一个套接字,并用作从该套接字接收数据的缓冲区。 Socket.BeginReceive( IList>, SocketFlags, A
我知道我可以通过 IList 进行枚举,例如: public byte[] ConvertToByteArray(IList> list) { IList newList = new List
我无法概念化 the new Span in C# 的用法. 它取代了什么结构? ArraySegment 现在过时了吗? 它启用了哪些以前没有的功能? Span 是 C# 数组的有效替代品吗?哪些情
我是一名优秀的程序员,十分优秀!