c# - 取消固定在 .NET 套接字服务器中自动固定的 byte[]

标签 c# .net tcp network-programming clr

我有一个异步套接字服务器。我遇到了一个问题,有问题的客户端和难以重现的网络事件导致大量字节 [] 被固定。由于处理客户端的所有线程都是隐式的(我使用 BeginAcceptClient,并且我使用回调而不是显式实例化的线程),所以我不控制固定过程。 “隐式线程”是指线程不是由我直接生成的,而是由托管我的应用程序的运行时生成的。

无论如何this中的答案帖子显示了如何取消固定对象。如果我继续前进并自己固定字节 [],执行 BeginRead 并在清理期间取消固定,是否可以覆盖幕后固定?

谢谢。

最佳答案

您链接到的帖子中的答案是完全错误的(我刚刚在那里发表了评论)。只有当最后一个固定句柄(更一般地说:固定“原因”,因为除 GCHandles 之外还有其他原因)被删除时,对象才会被取消固定。您不能强制取消固定。那将是非常不安全的。您可以使用安全的托管代码来做不安全的事情,这甚至是一个安全问题!

无论如何,尝试阻止对象的固定对您来说没有意义。即使这是可能的,你的进程也会随机崩溃!套接字依赖于固定的正确性。它不会无缘无故地这样做。

解决方案在别处:

  1. 在应用程序启动时创建所有缓冲区,以便所有缓冲区在内存中都是连续的。使用缓冲池。
  2. 使用少量大缓冲区并将其中的部分分配给各个客户端。

附注:Pinning 的实现方式与您想象的不同。固定不是您可以在对象上打开和关闭的标志。当您固定某物时,一开始并没有什么特别的事情发生。只有当 GC 运行时,GC 才会注意到存在具有它们正在固定的特殊属性的引用。然后它会阻止对象被移动。

关于c# - 取消固定在 .NET 套接字服务器中自动固定的 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10690012/

相关文章:

c# - 对动态类型变量的 ToString 调用在 C# 中的行为不同

c# - C# 中的 "Object cannot be cast from DBNull to other types"

.net - 提高 NHibernate 性能的最佳方法是什么?

.net - 使用外部程序集 : The located assembly's manifest definition does not match the assembly reference

tcp - 无法收到 Mirth 的 Ack

networking - 为什么 TCP/IP header 的大小必须是 32 位的倍数?

c# - NHibernate : No update with composite key

c# - 为什么编译器不能在这种重载解析情况下告诉更好的转换目标? (协方差)

.net - F# 比较区分联合的案例标识符

c# - 通过 TCP/IP 发送文本