当前位置: 首页 > news >正文

C# --- 单例类错误初始化 + 没有释放资源导致线程泄漏

C# --- 单例类错误初始化 + 没有释放资源导致线程泄漏

  • Background
  • 原因分析
    • 问题一: 错误初始化(使用了箭头函数)
    • 问题一: 没有Dispose资源

Background

  • 背景: service A的其中一个Api会向mq发送消息
  • 问题:线上发现这个服务经常有几百个线程在同时运行,怀疑是发生了线程泄漏
  • 什么是线程泄漏:代码产生了大量的不应该出现的线程,导致占用过多资源,严重影响系统性能

原因分析

经过排查发现了一下问题代码

public class Dispatch
{public static Dispatch Instance => new Dispatch();private readonly Sender senderpublic Dispatch() { sender = new Sender();}
}public class Sender : IDisposable
{private readonly Task _recoveryTask;public Sender() { recoveryTask = Task.Factory.StartNew(new Action(this.ReceoveryTaskEntry), TaskCreationOptions.LongRunning)}private void RecoveryTaskEntry() {while (!this.Disposed){//impl}}public void Dispose() {_recoveryTask.Dispose()GC.SuppressFinalize(this); // 阻止终结器调用}
}

问题一: 错误初始化(使用了箭头函数)

public static Dispatch Instance => new Dispatch();//等价于
public static Dispatch Instance() 
{return new Dispatch();
}

以上代码在 Dispatch.Insatnce被调用时每次都会新建一个Dispatch实例,而Dispatch的构造方法里会创建并运行一个新的线程,也就是说每个requets都会创建一个新的线程

正确的初始化:保证单例类只有一个实例

public static Dispatch Instance { get; } = new Dispatch();

问题一: 没有Dispose资源

在Dispatch中没有dispose sender, 导致线程没有被释放

public class Dispatch
{public static Dispatch Instance => new Dispatch();private readonly Sender senderpublic Dispatch() { sender = new Sender();}
}

正确实现:在Dispose中释放资源

public class Dispatch
{public static Dispatch Instance => new Dispatch();private readonly Sender senderpublic Dispatch() { sender = new Sender();}public void Dispose() {sender.Dispose()//....}
}
http://www.lryc.cn/news/590408.html

相关文章:

  • 【Linux】如何使用nano创建并编辑一个文件
  • 动态规划题解_打家劫舍【LeetCode】
  • 编译原理第四到五章(知识点学习/期末复习/笔试/面试)
  • 部分排序算法的Java模拟实现(复习向,非0基础)
  • AWS ML Specialist 考试备考指南
  • 【Qt】麒麟系统安装套件
  • uniapp写好的弹窗组件
  • OWASP Top 10 攻击场景实战
  • 在 CentOS 8 上彻底卸载 Kubernetes(k8s)
  • 01 启动流程实例
  • ICMR-2025 | 杭电多智能体协作具身导航框架!MMCNav:基于MLLM的多智能体协作户外视觉语言导航
  • 钱包核心标准 BIP32、BIP39、BIP44:从助记词到多链钱包的底层逻辑
  • STM32F4踩坑小记——使用HAL库函数进入HardFault
  • 蓝光三维扫描技术:手机闪光灯模块全尺寸3D检测的高效解决方案
  • HTML基础知识 二(创建容器和表格)
  • 在虚拟环境中复现论文(环境配置)
  • Class<T> 类传递及泛型数组
  • SSH连接复用技术在海外云服务器环境下的稳定性验证与优化方案
  • 动态规划的核心性质——最优化原理 (Principle of Optimality)
  • git的diff命令、Config和.gitignore文件
  • Python编程基础(六)| 用户输入和while循环
  • slurm设置用户节点和分区权限
  • Telink的GPIO
  • 系统思考场景应用
  • Node.js基础用法
  • 3DGS之COLMAP
  • iOS 抓包工具选择与配置指南 从零基础到高效调试的完整流程
  • VR 污水厂初体验:颠覆传统认知​
  • CSS全面系统教程:从入门到精通网页样式设计
  • 安全初级作业2