目 录html
1. 现象概述... 1数据库
2. 操做数据库的代码... 2api
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。以下图:ui
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
界面以下图: