在 C# 中手动取消固定 byte[]?

2023-12-15

在下面的代码中,client.Connect.Receive 似乎永久固定“byte[] 结果”,导致内存永远不会被释放(因为它始终被固定)。我正在寻找一种方法来告诉 C# 结果在 this.OnReceive 中使用后不再需要固定,但我找不到执行此操作的内置函数或关键字。

有谁知道如何让 C# 取消固定 byte[] 数组? (这是我的 C# 应用程序中内存泄漏的来源之一)

this.m_TcpListener = new TcpListener(this.p_TcpEndPoint.Port);
this.m_TcpThread = new Thread(delegate()
{
    try
    {
        this.m_TcpListener.Start();
        while (this.p_Running)
        {
            TcpClient client = this.m_TcpListener.AcceptTcpClient();
            new Thread(() =>
                {
                    try
                    {
                        // Read the length header.
                        byte[] lenbytes = new byte[4];
                        int lbytesread = client.Client.Receive(lenbytes, 0, 4, SocketFlags.None);
                        if (lbytesread != 4) return; // drop this packet :(
                        int length = System.BitConverter.ToInt32(lenbytes, 0);
                        int r = 0;

                        // Read the actual data.
                        byte[] result = new byte[length];
                        while (r < length)
                        {
                            int bytes = client.Client.Receive(result, r, length - r, SocketFlags.None);
                            r += bytes;
                        }

                        Console.WriteLine("Received TCP packet from " + (client.Client.RemoteEndPoint as IPEndPoint).Address.ToString() + ".");
                        this.OnReceive(client.Client.RemoteEndPoint as IPEndPoint, result, length);
                    }
                    catch (SocketException)
                    {
                        // Do nothing.
                    }

                    client.Close();                                
                }).Start();
            //this.Log(LogType.DEBUG, "Received a message from " + from.ToString());
        }
    }
    catch (Exception e)
    {
        if (e is ThreadAbortException)
            return;
        Console.WriteLine(e.ToString());
        throw e;
    }
}
);
this.m_TcpThread.IsBackground = true;
this.m_TcpThread.Start();

您可以自己固定/取消固定它,因此:

//Pin it 
GCHandle myArrayHandle = GCHandle.Alloc(result,GCHandleType.Pinned);
//use array
while (r < length)
{
    int bytes = client.Client.Receive(result, r, length - r, SocketFlags.None);
    r += bytes;
}
//Unpin it
myArrayHandle.Free();

但我个人非常惊讶 client.Connect.Receive 将其“永远”固定。我以前用过它(我相信很多人都用过)并且没有遇到此类问题。或者,如果您确定这就是问题所在,那么您可以在整个 while 循环中重复使用一个结果数组,而不是每次都分配一个新的结果数组(在启动侦听器的位置分配它,并且每次只使用 lenbytes 字节) )。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中手动取消固定 byte[]? 的相关文章

随机推荐

  • 如何正确终止 dll 内的挂起线程?

    大家好你们好 我有一个包含错误的第三方库 当我调用一个函数时 它可能会挂起 库函数在 dll 内部调用 我决定将调用移至线程中并等待一段时间 如果线程完成则确定 如果不是 我应该强制终止它 这里的简化示例 unsigned Counter
  • 使用 Unity 进行通用依赖注入

    我们将现有的日志记录库包装在 C 应用程序中我们自己的日志记录服务中 以便使用针对某些日志记录情况的预定义方法来包围它 public class LoggingBlockLoggingService ILoggingService priv
  • 如何使用 PHP 获取从 cPanel 到我的网站的磁盘空间使用情况和每月带宽传输

    我想知道如何以与登录 cPanel 帐户时显示的方式相同的方式在我的网站上显示 获取 磁盘空间使用情况和每月带宽传输 cPanel 是否有为此提供的 api 或者这是这样做的通用方法 我正在使用 PHP cPanel WHM 有一个 API
  • SonarQube“权限不足”

    自更新到 5 x 以来 由于 权限不足 问题 我们的许多构建作业目前都失败了 该问题应在 SonarQube 5 1 中解决 如中所述here但要么它实际上没有修复 要么存在另一个与我们当前运行 SonarQube 5 1 1 相同的错误的
  • 我的适配器上的notifyDataSetChanged() 不更新列表视图,为什么?

    我有一个扩展listactivity的活动 在这个类中扩展我有一个扩展baseadapter的类 现在在我的列表活动中我有这个 onCreate Called when the activity is first created Overr
  • 在 MSVS 中找不到 C++/CLI DLL 命名空间

    总体而言 我想要完成的是用 C 和 C 编写代码 以实现良好的性能 生产力平衡 这不是出于代码重用的原因 我只是希望能够在适合我的时候用本机 C 编写新代码 而不必承受其所有的恐怖 我有一个包含 4 个项目的解决方案 GUI C WPF 界
  • php:加载 oracle 驱动程序出现错误“无法加载动态库 - 找不到指定的过程。”

    我似乎在使用 PHP 时遇到了一个奇怪的问题 我已将一堆软件从一台服务器迁移到另一台服务器 在服务器上 一些脚本会与 Oracle 建立连接 因此为了能够建立连接 需要安装 Oracle 客户端并放置一个 tnsnames 文件 来自 sq
  • 如何在 jquery ui 自动完成中使用 json 传递隐藏 id?

    也许它是重复的 但我找不到解决方案 所以我发布了这个问题 我使用 jquery ui 来自动完成搜索框 它工作正常 但问题是我想使用 id example 进行搜索 当用户输入 paris 时 我尝试在 mysql 中发送 city id
  • 如何获取 Android 设备中的处理器速度和 RAM

    谁能帮助我如何通过代码获取 Android 设备的处理器名称 速度和 RAM 您可以像我们通常在 Linux 中获取的那样获取处理器 RAM 和其他硬件相关信息 我们可以在普通的 Linux 系统中从终端发出这些命令 你don t需要有一个
  • 如何将自定义长注释 geom_text 放入甜甜圈图的绘图区域内?

    我有以下真实用例的精简版本 其中我创建了一个甜甜圈图 并希望这些长标签适合整个图内部但甜甜圈外部 library ggplot2 df lt data frame group c Cars Trucks Motorbikes n c 25
  • 在并发创建线程之前读取修改的变量是否安全?

    pseudocode for illustration int g 0 void fn if g 1 std cout lt lt hello lt lt std endl else std cout lt lt world lt lt s
  • 在 python 中打开并显示适合图像

    import matplotlib pyplot as plt from astropy io import fits def openfit b hdu list fits open b hdu list info image data
  • 使用 jQuery 获取点击颜色的十六进制值

    我想知道如何使用 jQuery 制作一个颜色选择器 它允许您单击页面上的某个位置并返回您单击的颜色的十六进制颜色值 我知道使用 javascript 或 jquery 都是可能的 因为它们不仅有很多颜色选择器插件 而且我有一个具有相同功能的
  • 如何在“ExecuteGroovyScript”处理器中使用“DBCPConnectionPoolLookup”?

    我想在 ExecuteGroovyScript 处理器中使用 DBCPConnectionPoolLookup 控制器服务 我设置 数据库名称 但我收到这个错误 这是 ExecuteGroovyScript 配置 I found someo
  • 将数组(元素组合)划分为自定义分区的所有方法

    我想将 n 个元素的数组划分为给定大小的子数组 并包含所有可能的元素组合 例如 Array 1 2 3 4 可以是 n 个元素 1 给定尺寸模式 仅作为示例 可能会有所不同 2 subarrays 2 elements 预期结果 1 2 3
  • 增加图像中文本行之间的间距

    我有一个单行距文本段落的输入图像 我正在尝试实现类似行间距选项的功能 以增加 减少 Microsoft Word 中文本行之间的间距 当前图像是单倍行距 如何将文本转换为双倍行距 或者说 5空间 本质上 我试图动态地重组文本行之间的间距 最
  • 控制台鼠标输入不起作用

    我正在使用 Visual Studio 开发一个 C 控制台项目 其中鼠标负责执行所有输入操作 它在 Windows 7 上运行良好 但在 Windows 10 上则不行 我将向您展示一些代码 这是我的实际代码的非常简化的版本 但这里是一样
  • Symfony2 - FOSUserBundle - 多个登录位置

    我正在使用 FOSUserBundle 并且我需要能够从 2 个不同的路由 或更多 登录 这些路线将有不同的模板 并且登录到不同的区域 登录之间唯一的区别是所需的权限 路线将类似于 site com 登录 site com admin lo
  • ApiController的自动测试

    我有一个ApiController并想通过包括路由在内的单元测试来测试它 一个例子 RoutePrefix prefix public class Controller ApiController HttpGet Route id1 pub
  • 在 C# 中手动取消固定 byte[]?

    在下面的代码中 client Connect Receive 似乎永久固定 byte 结果 导致内存永远不会被释放 因为它始终被固定 我正在寻找一种方法来告诉 C 结果在 this OnReceive 中使用后不再需要固定 但我找不到执行此