2

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

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

谢谢。

4

2 回答 2

4

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

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

解决方案在别处:

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

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

于 2012-05-21T20:47:08.227 回答
1

我建议您不要专注于 Pin/Unpin,而是从不同的 AppDomain 执行所有套接字调用。然后,当您处于“空闲/安全”点时,您可以卸载并重新加载该 AppDomain 以将其中的内存重置为良好状态。

于 2012-05-21T20:55:17.350 回答