gpt4 book ai didi

c# - BeginSend
转载 作者:太空狗 更新时间:2023-10-29 21:59:18 26 4
gpt4 key购买 nike

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

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

我有一个返回 ArraySegment<byte> 的 BufferManager 类指定的恒定大小为 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 文档:

You can use the BufferManager class to manage a buffer pool. The pool and its buffers are created when you instantiate this class and destroyed when the buffer pool is reclaimed by garbage collection. Every time you need to use a buffer, you take one from the pool, use it, and return it to the pool when done. This process is much faster than creating and destroying a buffer every time you need to use one.

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

关于c# - BeginSend<IList<ArraySegment....) 是否执行所有 ArraySegment 的原子发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569104/

26 4 0

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com