.NETCore在析构函数(Finalize)在Linux下引起程序异常退出现象
目 录
1. 现象概述... 1
2. 操作数据库的代码... 2
3. 引起的异常... 2
4. 异常信息分析... 3
5. 分析结论猜测... 3
1. 现象概述
.NETCore的Console和AspNetCore程序对数据库进行操作,通过析构函数(Finalize)释放数据库连接资源,在Linux平台引起程序或服务异常退出,在Windows平台没有出现。
2. 操作数据库的代码
析构函数(Finalize)释放数据库连接的代码,如下:
/// <summary>
/// 析构函数,释放数据库连接资源
/// </summary>
~ServesDBContext()
{
Dispose();
System.Diagnostics.Debug.WriteLine("ServesDBContext 回收了!");
}
/// <summary>
/// 释放数据库连接资源
/// </summary>
public void Dispose()
{
if (Context != null)
{
Context.Dispose();
}
}
3. 引起的异常
Console控制台程序,实时运行的服务运行一段时间就会出现异常信息:Object reference not set to an instance of an object。如下图:

AspNetCore应用程序,除了提示上述信息以外,还打印出来的异常信息::system.threading.lockrecursionexception: recursive write lock acquisitions not allowed in this mode。如下图:

4. 异常信息分析
首先异常信息的Exception已经捕捉到了,但是运行的程序异常退出了(Abort)。查找官方的文档,按关键lockrecursionexception搜索,网址:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.lockrecursionexception?view=netcore-3.1。关键提示信息,如下图:
MSDN关键提示信息:程序使用无参数构造函数创建一个 ReaderWriterLockSlim,该构造函数不允许使用递归。
5. 分析结论猜测
第一层猜测:是由于析构函数释放资源引起了程序出现递归现象(recursion)。
第二层猜测:析构函数释放资源出现递归现象,可能是由于Linux的垃圾回收机制与Windows的垃圾回收机制不同引起的,因为同样的代码,在Windows下没有出现任何问题,但是Linux下没有更深入的研究。
第三层猜测:类同样继承了IDisposable资源释放接口,实现了Dispose函数。同时又实现了析构函数(Finalize)释放资源,同样调用了Dispose函数。两种释放资源,在Linux下垃圾回收过程造成了冲突。
注:由于没有进一步深入研究,所以以上是针对结论的一种猜测,有感兴趣的朋友可以共同研究。
文章:
《.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏》
《[视频演示].NET Core开发的iNeuOS物联网平台,实现从设备&PLC、云平台、移动APP数据链路闭环》
《.NET Core开发的iNeuOS物联网平台部署树霉派(raspbian),从网关到云端整体解决方案》
《.NET Core开发的iNeuOS物联网平台部署在Ubuntu操作系统,无缝跨平台》
《iNeuOS 物联网云操作系统2.0发布,集成设备容器、视图建模、机器学习三大模块》
物联网&大数据技术 QQ群:54256083
物联网&大数据合作 QQ群:727664080
联系QQ:504547114
合作微信:wxzz0151
界面如下图:

.NETCore在析构函数(Finalize)在Linux下引起程序异常退出现象的更多相关文章
- linux下c程序调用reboot函数实现直接重启【转】
转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启 当然你也可以直接调用syst ...
- Linux下C程序的编辑,编译和运行以及调试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- 位图文件(BMP)格式以及Linux下C程序实现(转)
源:位图文件(BMP)格式以及Linux下C程序实现 说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图 ...
- Linux下C程序内存泄露检测
在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...
- Linux下C程序的内存映像
2.Linux下C程序的内存映像 2.1. 代码段.只读数据段(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)(2)只读数据段就是在程序运行期间只能读不能写的数据,con ...
- Linux C程序异常退出怎么办——core文件帮你忙
Linux C程序异常退出怎么办——core文件帮你忙 http://blog.csdn.net/zhu2695/article/details/51512138
- 【转】Linux下进程/程序网络带宽占用情况查看工具 -- NetHogs
http://www.cnblogs.com/carbon3/p/5930803.html 之前VPS侦探曾经介绍过流量带宽相关的工具如:iftop.vnstat,这几个都是统计和监控网卡流量的.但是 ...
- linux下c程序的链接、装载和库(1)
读完<程序员的自我修养--链接.装载和库>相关章节,想来总结一下,若有错误,请指正,多谢. 1. 什么叫目标文件? 你的工程里有很多xxx.c这样的源文件,这些文件是文本文件,只有人能够认 ...
- Linux下修改默认字符集--->解决Linux下Java程序种中文文件夹file.isDirectory()判断失败的问题
一.问题描述: 一个项目中为了生成树状目录,调用了file.listFiles()方法,然后利用file.isDirectory()方法判断是否为目录,该程序在windows下运行无问题,在Linux ...
随机推荐
- JavaScript 的诞生
JavaScript的历史 网景 1993年出现网页浏览器NCSA Mosaic 1994年出现Netscape Navigator,并占据四分之三浏览器市场 1995年5月布兰登根据公司的要求发明一 ...
- Kubernetes使用Eedpoints连接外部服务端口
Kubernetes使用Eedpoints连接外部服务端口 背景: 在Kubernetes的使用环境中,我们经常要连接外部的一些服务,比如mysql Elasticsearch kafka 等等外部的 ...
- 尝试写一写4gl与4fd
4gl DATABASE ds GLOBALS "../../config/top.global" DEFINE g_curs_index LIKE t ...
- Java通过反射加载的类,变量无法注入
//之前都是直接newInstance的到obj,类中的变量无法被注入//Object obj = aClass.newInstance(); //改成如下方式的到bean,变量就能顺利被注入 ,其他 ...
- 8点了解Java服务端单元测试
一. 前言 单元测试并不只是为了验证你当前所写的代码是否存在问题,更为重要的是它可以很大程度的保障日后因业务变更.修复Bug或重构等引起的代码变更而导致(或新增)的风险. 同时将单元测试提前到编写正式 ...
- 力扣Leetcode 983. 最低票价
最低票价 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出.每一项是一个从 1 到 365 的整数. 火车票有三种不同的销 ...
- 树(Tree)解题总结
定义 树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由 n(n>0) 个有限节点组成一个具有层次关系的集合.. 二叉搜索树(Binar ...
- PJSIP开发指南-第二章
一.模块 2.1 模块框架 模块框架的主要作用是在应用程序组件之间分发SIP消息,PJSIP的所有的组件,包括dialog和transaction都是以模块方式实现的,没有模块,核心协议栈将不知 ...
- .net core学习笔记,组件篇:服务的注册与发现(Consul)初篇
1.什么是服务注册中心? 在学习服务注册与发现时,我们要先搞明白到底什么是服务注册与发现. 在这里我举一个生活中非常普遍的例子——网购来简单说明,网购在我们日常生活中已经是非常普遍了,其实网购中的(商 ...
- MySQL常用指令,java,php程序员,数据库工程师必备。程序员小冰常用资料整理
MySQL常用指令,java,php程序员,数据库工程师必备.程序员小冰常用资料整理 MySQL常用指令(备查) 最常用的显示命令: 1.显示数据库列表. show databases; 2.显示库中 ...