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

时间:2012-05-21 17:45:00

标签: c# .net tcp network-programming clr

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

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

感谢。

2 个答案:

答案 0 :(得分:4)

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

无论如何,试图阻止物体钉扎是没有意义的。即使这是可能的,但事实并非如此,您的过程会随机崩溃!套接字依赖于固定的正确性。它没有理由不这样做。

解决方案在别处:

  1. 在应用程序启动时创建所有缓冲区,以便所有缓冲区在内存中是连续的。使用缓冲池。
  2. 使用少量大缓冲区并将其中的部分分配给各个客户端。
  3. 一个小小的注意事项:固定的实现方式与您的想法不同。固定不是可以在对象上打开和关闭的标志。当你固定东西时,一开始没有什么特别的事。只有在GC运行时,GC才会注意到存在具有特定属性的引用它们正在固定。然后它会阻止对象移动。

答案 1 :(得分:1)

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