目 錄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
界面以下圖: