fix: 收敛旧模块资源释放与诊断

This commit is contained in:
2026-08-15 10:13:08 +08:00
parent 222ae3c08a
commit c49015d390
60 changed files with 4218 additions and 409 deletions
+108 -21
View File
@@ -424,6 +424,7 @@ namespace Lskj.Control
/// 自定义查询条件
/// </summary>
public MyControl SearchObj { get; private set; }
private bool mModuleResourcesReleased;
/// <summary>
/// 左查询条件
/// </summary>
@@ -516,6 +517,17 @@ namespace Lskj.Control
searchObj = new MyControl(ReplaceBmpField(this.SysModel.MenuSql), gcMain, LeftTreeViewEx, LeftGridEx, _leftGridSearchObj);//替换sql语句中的bmp字段
searchObj.SpecialLeftTable = this.SpecialLeftTable;
searchObj.Model = Model;
if (!fixedQuery && Model.DataCaches != null)
{
searchObj.OtherParams = Model.OtherParams();
DynamicModel searchModel = Model;
DataTable searchControls = _queryTable;
Model.DataCaches.AddTask(searchObj, "DynamicModel",
new Task<DynamicModel>(() => searchModel));
Model.DataCaches.AddTask(searchObj, "ControlsTable",
new Task<DataTable>(() => searchControls));
searchObj.GetSearchDataCaches(Model.DataCaches);
}
}
this.SearchObj = searchObj;
@@ -2459,8 +2471,6 @@ namespace Lskj.Control
form.SubForm.Dispose();
form = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
catch (Exception ex)
@@ -3680,6 +3690,102 @@ namespace Lskj.Control
this.OperShortMode = true;
}
internal void ReleaseResourcesForDispose()
{
if (mModuleResourcesReleased)
{
return;
}
mModuleResourcesReleased = true;
PrintUtil.OnAfterPrint -= OnReportPrintAfter;
MyControl searchObj = SearchObj;
SearchObj = null;
if (searchObj != null)
{
searchObj.OnSearchBeforeCallBack -= OnSearchBeforeCallBack;
searchObj.OnSearchAfterCallBack -= OnSearchAfterCallBack;
searchObj.OnDataSourceBindCallBack -= OnMainSearchDataSourceBindCallBack;
searchObj.Dispose();
}
try
{
if (gcMain != null)
{
if (gcMain.GridView != null)
{
gcMain.GridView.FocusedRowObjectChanged -= OnGridViewFocusedRowObjectChanged;
gcMain.GridView.ShowingEditor -= OnGridViewShowingEditor;
gcMain.GridView.DoubleClick -= OnGridViewDoubleClick;
gcMain.GridView.MouseDown -= OnGridViewMouseDown;
gcMain.GridView.MouseDown -= OnGridMouseDown;
gcMain.GridView.MouseMove -= OnGridMouseMove;
gcMain.GridView.MouseUp -= OnGridMouseUp;
}
if (gcMain.CustomGroupBandEx != null)
{
gcMain.CustomGroupBandEx.GridView.FocusedRowObjectChanged -= OnGridViewFocusedRowObjectChanged;
gcMain.CustomGroupBandEx.GridView.ShowingEditor -= OnGridViewShowingEditor;
}
if (gcMain.ParentControl != null &&
ReferenceEquals(gcMain.ParentControl, searchObj))
{
gcMain.ParentControl = null;
}
gcMain.Model = null;
gcMain.SysModel = null;
}
}
catch
{
// A partially disposed DevExpress view must not stop module cleanup.
}
try
{
if (Model != null && Model.DataCaches != null)
{
Model.DataCaches.Remove(this);
}
}
catch
{
// Cache cleanup must not interrupt control disposal.
}
OnSaveGridCallBack = null;
AfterDeleteGridCallBack = null;
RightGridCallBack = null;
DetailRightGridCallBack = null;
OnCloseCallback = null;
AfterRefreshingCallBack = null;
SaveEvent = null;
OnExportCallBack = null;
verifyDetailsTab = null;
if (m_dragRowShadow != null)
{
m_dragRowShadow.Dispose();
m_dragRowShadow = null;
}
ButtonModeRightMenus.Clear();
RightButtons.Clear();
itemCommonList.Clear();
LineStatus.Clear();
_leftGridSearchObj = null;
LeftTreeViewEx = null;
LeftGridEx = null;
SpecialLeftTable = null;
ParentGridEx = null;
ParentControlEx = null;
ParentControlObj = null;
TabObj = null;
Model = null;
SysModel = null;
}
/// <summary>
/// 明细父表格点击后刷新明细按钮权限
/// </summary>
@@ -3962,25 +4068,6 @@ namespace Lskj.Control
{
return BaseModuleImpl.GetSchemesList(dynamicModel.ModuleId);//获取高级查询条件模版
}));
//InitializeQueryCondition
Task<MyControl> searchObjTask = cachesDic.AddTask(this, "SearchObj", new Task<MyControl>(() =>
{
DataTable queryTable = customQueryFieldsTask.Result;
bool fixedQuery = queryTable == null || queryTable.Rows.Count == 0;
MyControl myControl = new MyControl(sysModel.MenuSql, gcMain, LeftTreeViewEx, LeftGridEx, _leftGridSearchObj)
{
SpecialLeftTable = this.SpecialLeftTable,
Model = dynamicModel
};
if (!fixedQuery)
{
myControl.OtherParams = dynamicModel.OtherParams();
cachesDic.AddTask(myControl, "DynamicModel", dynamicModelTask);
cachesDic.AddTask(myControl, "ControlsTable", customQueryFieldsTask);
myControl.GetSearchDataCaches(cachesDic);
}
return myControl;
}));
Task<ModuleModel> searchSysModelTask = cachesDic.AddTask(pl_top_search, "SysModel", new Task<ModuleModel>(() =>
{
return new ModuleModel(MainImpl.GetSystemdllTab(dynamicModel.ModuleCode));