我有一个异步套接字服务器。我遇到了一个问题,有问题的客户端和难以重现的网络事件导致大量字节 [] 被固定。由于处理客户端的所有线程都是隐式的(我使用 BeginAcceptClient,并且我使用回调而不是显式实例化的线程),所以我不控制固定过程。 “隐式线程”是指线程不是由我直接生成的,而是由托管我的应用程序的运行时生成的。
无论如何this中的答案帖子显示了如何取消固定对象。如果我继续前进并自己固定字节 [],执行 BeginRead 并在清理期间取消固定,是否可以覆盖幕后固定?
谢谢。
最佳答案
您链接到的帖子中的答案是完全错误的(我刚刚在那里发表了评论)。只有当最后一个固定句柄(更一般地说:固定“原因”,因为除 GCHandles 之外还有其他原因)被删除时,对象才会被取消固定。您不能强制取消固定。那将是非常不安全的。您可以使用安全的托管代码来做不安全的事情,这甚至是一个安全问题!
无论如何,尝试阻止对象的固定对您来说没有意义。即使这是可能的,你的进程也会随机崩溃!套接字依赖于固定的正确性。它不会无缘无故地这样做。
解决方案在别处:
- 在应用程序启动时创建所有缓冲区,以便所有缓冲区在内存中都是连续的。使用缓冲池。
- 使用少量大缓冲区并将其中的部分分配给各个客户端。
附注:Pinning 的实现方式与您想象的不同。固定不是您可以在对象上打开和关闭的标志。当您固定某物时,一开始并没有什么特别的事情发生。只有当 GC 运行时,GC 才会注意到存在具有它们正在固定的特殊属性的引用。然后它会阻止对象被移动。
关于c# - 取消固定在 .NET 套接字服务器中自动固定的 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10690012/