我有一个包含多个步骤的进程,它们被定义为一个通用策略模式的实现。在这个过程中,所有步骤都会传递一个共同的ProcessParameter对象。(对其进行读/写操作)
这个ProcessParameter对象具有许多数组和集合。例如:
class ProcessParameter() {
public List<int> NumbersAllStepsNeed {get; set;}
public List<int> OhterNumbersAllStepsNeed {get; set;}
public List<double> SomeOtherData {get; set;}
public List<string> NeedThisToo {get; set;}
...
}
步骤完成后,我想确保内存已被释放且不残留,因为这可能会占用大量内存,并且其他进程也需要运行。
我是通过运行以下命令来实现的:
pParams.NumbersAllStepsNeed = null;
pParams.OhterNumbersAllStepsNeed = null;
pParams.SomeOtherData = null;
...
或是ProcessParameter应该实现IDisposable接口,并使用Dispose方法进行处理,然后我只需要使用()(或将其包装在using块中) 什么是清除运行中一个进程使用数据的内存占用量的最佳和最优雅的方式?
使用数组而不是列表会有所改变吗?或者混合使用呢?我需要的实际参数类型是自定义对象的集合/数组。
我是否朝着正确的方向寻找答案?
更新
很棒的问题!感谢您的评论!
我曾经将这个进程作为单个运行,我可以看到内存使用量非常高,然后逐渐降至“正常水平”。
问题出在我开始将这些进程链接在一起并使用不同的起始参数时。那时内存飙升得非常高,因此我想在两个进程之间加入清理步骤,并寻找最佳方式来完成这项工作。
有一个数据库,这个参数是一种“缓存”,以加快速度。
IDisposable的观点很好,我没有在params对象中保留不受管控的资源。
IDisposable
用于释放非托管资源。要使托管对象有资格进行垃圾回收,只需要确保没有对它的引用即可。参见 What is the correct way to free memory in C#。 - IgorProcessParameter
不再可达并被收集,其属性中包含的所有对象也将被回收。通常情况下,除非您保留ProcessParameter
实例的时间比子对象长得多,否则不需要显式地将它们设置为null
。如果确实有这样的需求,您应该认真考虑在诉诸半手动内存管理花招之前先拆分对象。首先,这些东西是等待发生NullReferenceException
意外的事情。 - Jeroen Mostert