From 5c23e925872ddc393e3d8b86827fd7ab8ecf33c3 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sat, 13 Jun 2026 12:24:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20OnDisable=20=E5=8A=A0=20GC.Collect+WaitF?= =?UTF-8?q?orPendingFinalizers=20=E9=98=B2=20SQLite=20=E6=9E=90=E6=9E=84?= =?UTF-8?q?=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sqlite-net PreparedSqlLiteInsertCommand 析构器在 GC 线程跑 sqlite3_finalize - Domain reload 时 SQLite native 可能已卸载 → 崩溃 - GC.Collect+WaitForPendingFinalizers 确保析构器在 native 还活着时完成 --- .../CounterDrone.Core/CounterDrone.Core.dll | Bin 123904 -> 123904 bytes .../Assets/Scripts/Managers/GroupManager.cs | 2 +- .../Assets/Scripts/Managers/ModelManager.cs | 2 +- .../Assets/Scripts/Managers/ReportManager.cs | 2 +- .../Scripts/Managers/ScenarioManager.cs | 2 +- .../Scripts/Managers/SimulationRunner.cs | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll index 2b517f34ffe3cbcee3eff94144911fae58a65746..587a29b58284b9f759d45212a235b6907fe12638 100644 GIT binary patch delta 247 zcmZoT!QOC!eL@FIg5}k@jXhg?7^mzIs1BN>!2I-}|LSt1iM;N8leQb|WK>tsNHn%I zF}6%LFfvX}v`8{eHb^x#GfK8dF-|d0Hcv`6G)_r1v@}UF-Clo_@hBt9*F=NQ(>-o8 z1_<;Vt(f%tlALqz1@8@lM{;bYuei-vtpF8W>b`ntW<_X1`CEHAPXdt3Z%_|;>kd<6d*f=!5qjo2g)Zi7=rn! QKpJF55(Ch24;dSo0O4^_mH+?% delta 247 zcmZoT!QOC!eL@Gz^srlN8+*3)FizPaAoHD}aANmWx5Y=U1fEFAaM^CKlTlqk!#F9? zBGn|#%)lhk&@9!$G$|#`&^*=D#5lz`F)7U?)!fL`!rU^+V0-;d#-ofZDFJ~yr+eIH z3=sIf^mk|0g<{8@f*&T%jhLh}eZ_6YY6Yn1L6|5|z2(8ie-(U>(%*b{HFw(Xe24KZ zi@z~L52}2r#8G`|kPGm3yvQmMfra;*gptvD}IgoD(lrskMje#nXfTAWq WF>?kZptuE)wgid+9ruv2kqH3AcT@NP diff --git a/src/Unity/Assets/Scripts/Managers/GroupManager.cs b/src/Unity/Assets/Scripts/Managers/GroupManager.cs index 7155024..c2ea6ff 100644 --- a/src/Unity/Assets/Scripts/Managers/GroupManager.cs +++ b/src/Unity/Assets/Scripts/Managers/GroupManager.cs @@ -22,7 +22,7 @@ namespace CounterDrone.Unity _service = new GroupService(new GroupRepository(_db)); } - void OnDisable() { _db?.Dispose(); _db = null; } + void OnDisable() { _db?.Dispose(); _db = null; GC.Collect(); GC.WaitForPendingFinalizers(); } public Group Create(string name, GroupType type, string desc = "") => _service.CreateGroup(name, type, desc); diff --git a/src/Unity/Assets/Scripts/Managers/ModelManager.cs b/src/Unity/Assets/Scripts/Managers/ModelManager.cs index 6a41157..941af42 100644 --- a/src/Unity/Assets/Scripts/Managers/ModelManager.cs +++ b/src/Unity/Assets/Scripts/Managers/ModelManager.cs @@ -24,7 +24,7 @@ namespace CounterDrone.Unity _service = new ModelService(new ModelRepository(_db), _paths); } - void OnDisable() { _db?.Dispose(); _db = null; } + void OnDisable() { _db?.Dispose(); _db = null; GC.Collect(); GC.WaitForPendingFinalizers(); } public ModelInfo Import(string filePath, string name) => _service.ImportModel(filePath, name); public void Delete(string id) => _service.DeleteModel(id); diff --git a/src/Unity/Assets/Scripts/Managers/ReportManager.cs b/src/Unity/Assets/Scripts/Managers/ReportManager.cs index 66c5de6..a784f20 100644 --- a/src/Unity/Assets/Scripts/Managers/ReportManager.cs +++ b/src/Unity/Assets/Scripts/Managers/ReportManager.cs @@ -22,7 +22,7 @@ namespace CounterDrone.Unity _service = new ReportService(_db, _paths); } - void OnDisable() { _db?.Dispose(); _db = null; } + void OnDisable() { _db?.Dispose(); _db = null; GC.Collect(); GC.WaitForPendingFinalizers(); } public SimulationReport Generate(string taskId, TaskFullConfig cfg, List events, string status, float duration) => _service.Generate(taskId, cfg, events, status, duration); diff --git a/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs b/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs index 92a462f..f6a5f32 100644 --- a/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs +++ b/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs @@ -35,7 +35,7 @@ namespace CounterDrone.Unity } } - void OnDisable() { _db?.Dispose(); _db = null; } + void OnDisable() { _db?.Dispose(); _db = null; GC.Collect(); GC.WaitForPendingFinalizers(); } public SimTask CreateTask(string name, string number) => _service.CreateTask(name, number); public void DeleteTask(string id) => _service.DeleteTask(id); diff --git a/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs b/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs index a09eb50..c156455 100644 --- a/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs +++ b/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs @@ -149,7 +149,7 @@ namespace CounterDrone.Unity } public void Stop() => _engine?.Stop(); - void OnDisable() { _db?.Dispose(); _db = null; } + void OnDisable() { _db?.Dispose(); _db = null; GC.Collect(); GC.WaitForPendingFinalizers(); } void OnDestroy() => Stop(); private void SpawnDroneVisual(DroneEntity drone)