在 C# 中处理大型表单级对象的正确且最快的方法
Proper and Fastest way to dispose of a large form level object in C#
我了解使用 Dispose/Finalize 模式的基础知识,我会尽可能地使用它,但我似乎对这种情况有疑问。
我有一个很小的对象:
// Small Object
public class Class1
{
public int SampleId { get; set; }
}
// Form Level Object
public IList<Class1> MyClasses { get; set; }
MyClasses 是通过从数据库加载最多几千个 Class1 对象来填充的。该过程正常工作。
因为 List<> 对象上没有 Dispose 方法,而且它使用了大量内存,所以我不确定如何处理它。当用户关闭表单时,我是否允许默认的 Close() 方法清理 MyClasses,我是否应该使用 MyClasses.Clear() 来减小 Dispose 方法中列表的大小,将 MyClasses 设置为 null,或者可能还有别的吗?
一旦用户关闭此表单,他们可能会重新打开表单并加载另一组数据进行处理,其大小可能为几千。几分钟后,它们可能会消耗大量内存。
我想回收 MyClasses 正在使用的内存,这样我就可以在用户下次打开表单时重新使用它。
如果 Class1 中有许多字段使每条记录变得相当大,我应该使用哪种方法来清理 MyClasses 会有所不同吗?
简短回答:您无需担心试图回收 List
的内存。
更长的答案:您可以阅读有关 .NET 的垃圾收集的内容 here。每当托管对象(.NET 类型的对象)不再被任何变量引用时,它们就会成为垃圾收集器的对象。它们会自动清理干净。
如果您的应用程序占用过多内存时遇到问题,您可以:
- 检索的数据比您实际需要的多(寻找可能检索大型数据集并在内存中过滤的位置,而不是在检索期间应用过滤)
- 您正在保留对不再需要的旧数据的引用,这会阻止 GC 接触它。
我了解使用 Dispose/Finalize 模式的基础知识,我会尽可能地使用它,但我似乎对这种情况有疑问。
我有一个很小的对象:
// Small Object
public class Class1
{
public int SampleId { get; set; }
}
// Form Level Object
public IList<Class1> MyClasses { get; set; }
MyClasses 是通过从数据库加载最多几千个 Class1 对象来填充的。该过程正常工作。
因为 List<> 对象上没有 Dispose 方法,而且它使用了大量内存,所以我不确定如何处理它。当用户关闭表单时,我是否允许默认的 Close() 方法清理 MyClasses,我是否应该使用 MyClasses.Clear() 来减小 Dispose 方法中列表的大小,将 MyClasses 设置为 null,或者可能还有别的吗?
一旦用户关闭此表单,他们可能会重新打开表单并加载另一组数据进行处理,其大小可能为几千。几分钟后,它们可能会消耗大量内存。
我想回收 MyClasses 正在使用的内存,这样我就可以在用户下次打开表单时重新使用它。
如果 Class1 中有许多字段使每条记录变得相当大,我应该使用哪种方法来清理 MyClasses 会有所不同吗?
简短回答:您无需担心试图回收 List
的内存。
更长的答案:您可以阅读有关 .NET 的垃圾收集的内容 here。每当托管对象(.NET 类型的对象)不再被任何变量引用时,它们就会成为垃圾收集器的对象。它们会自动清理干净。
如果您的应用程序占用过多内存时遇到问题,您可以:
- 检索的数据比您实际需要的多(寻找可能检索大型数据集并在内存中过滤的位置,而不是在检索期间应用过滤)
- 您正在保留对不再需要的旧数据的引用,这会阻止 GC 接触它。