gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:36:13 25 4
gpt4 key购买 nike

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

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

谢谢。

最佳答案

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

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

解决方案在别处:

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com