目 錄
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發布,集成設備容器、視圖建模、機器學習三大模塊 》
《iNeuOS云作業系統,.NET Core全系打造 》
物聯網&大資料技術 QQ群:54256083
物聯網&大資料合作 QQ群:727664080
網站:http://www.ineuos.net
聯系QQ:504547114
合作微信:wxzz0151
界面如下圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/38370.html
標籤:.NET Core
上一篇:【AspNetCore原始碼】設計模式 - 提供者模式
下一篇:netcore資料連接配置
