.NETCore在析构函数(Finalize)在Linux下引起程序异常退出现象

目       录

1.      现象概述... 1

2.      操作数据库的代码... 2

3.      引起的异常... 2

4.      异常信息分析... 3

5.      分析结论猜测... 3


 1.   现象概述

     .NETCore的Console和AspNetCore程序对数据库进行操作,通过析构函数(Finalize)释放数据库连接资源,在Linux平台引起程序或服务异常退出,在Windows平台没有出现。

2.   操作数据库的代码

     析构函数(Finalize)释放数据库连接的代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <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发布,集成设备容器、视图建模、机器学习三大模块

   iNeuOS云操作系统,.NET Core全系打造


 

    物联网&大数据技术 QQ群:54256083 

   物联网&大数据合作 QQ群:727664080

   网站:http://www.ineuos.net

   联系QQ:504547114

  合作微信:wxzz0151

  界面如下图:

 

posted @   iNeuOS工业互联网系统  阅读(1320)  评论(5编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
历史上的今天:
2016-04-28 [更新]跨平台物联网通讯框架 ServerSuperIO v1.2(SSIO),增加数据分发控制模式
点击右上角即可分享
微信分享提示