我有一个异步套接字服务器。我遇到了一个问题,即有问题的客户端和难以重现的网络事件导致大量字节 [] 被固定。由于处理客户端的所有线程都是隐式的(我使用 BeginAcceptClient,并且我使用回调而不是显式实例化的线程)我不控制固定过程。“隐式线程”是指不是由我直接生成的线程,而是由托管我的应用程序的运行时生成的。
无论如何,这篇文章中的答案显示了如何取消固定对象。如果我继续并自己固定我的字节 [],是否可以覆盖幕后固定,在清理期间执行 BeginRead 和取消固定?
谢谢。
您链接到的帖子中的答案是完全错误的(我只是在那里留下了评论)。只有当最后一个固定句柄(更一般地说:固定“原因”,因为除了 GCHandles 之外还有其他原因)被移除时,对象才会被取消固定。您不能强制取消固定。那将是非常不安全的。您可以使用安全的托管代码来做不安全的事情,这甚至是一个安全问题!
无论如何,尝试阻止对象固定对您来说是没有意义的。即使这是可能的,但事实并非如此,您的进程也会随机崩溃!套接字依靠固定来确保正确性。它不会无缘无故地这样做。
解决方案在别处:
一个小的旁注:固定的实现与您的想法不同。固定不是您可以在对象上打开和关闭的标志。当您固定某些东西时,一开始并没有什么特别的事情发生。只有在 GC 运行时,GC 才会注意到存在具有它们正在固定的特殊属性的引用。然后它会阻止对象被移动。
我建议您不要专注于 Pin/Unpin,而是从不同的 AppDomain 执行所有套接字调用。然后,当您处于“空闲/安全”点时,您可以卸载并重新加载该 AppDomain 以将其中的内存重置为良好状态。