C# winform程序,之前也来问过问题,因为,winform直接从文本文件读数据,然后放在了内存中,因为有很多个窗口,没打开一个窗口时,可能就涉及到一些数组(我的数据源)的赋值,文本数据有200MB+,全部读到内存中去之后(已经是按照分组来读数据了) 发现此时程序占用了700MB+的内存,之后,在窗口上打开衍生出来的子窗体,占用内存进一步加大,随着打开越来越多的窗口,程序越来越慢,电脑越来越卡。 不知道如何做优化。
于是我想到一些方面,试了之后没效果,希望大家指导,我的基础很差;1.是不是 我用局部变量来临时存储一些数据,方法结束之后,就应该会自动释放掉了?2.关闭窗口时,我在formclosing里面删掉了该窗体产生的线程,还有把设计器中的Dispose放到了窗口类中,并且在 protected override void Dispose(bool disposing)中加了GC.Collect();,我想这样做,或者不用这样做,在关闭这个窗口的之后,系统是不是应该会释放它所占用的资源,可是观察了一下 任务管理器,冒失内存使用量一点就下降了3MB左右。难道我这样想是错的。
先就以上这些问题,欢迎大家给我讲解一下,谢谢啦!没分了,大家见谅PS:我没使用数据库,我的数据源就是文本文件
解决方案 »
- 菜鸟问题:winform怎么连到Web系统
- [*Access数据库连接问题*]为什么在VB6下可以连接,在C#.net下就不行呢,谁能给个连接串啊.
- 我写了一个C#的网络通讯程序,运行后,CPU占用率到达99%,该如果解决,急
- 在app.config中怎么用变量啊?
- richtextbox的问题!
- .NET下面的日期控件!
- 来自数据源的 Single 类型的给定值不能转换为指定目标列的类型 decimal
- 百分求书:电子版《C#入门经典》
- 求助!
- 请问有没有介绍WEB窗体控件和WINDOWS控件的书或资料。
- SwfDotNet类读取swf文件
- WinForm 如果获取当前IE程序中的地址栏中的URL地址
看下这个
#region 清空内存
[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr process,
int minSize,
int maxSize
);
/// <summary>
/// 在占用大量内存的窗体关闭时执行,释放内存
/// </summary>
public static void FlushMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
FormFunction.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion
刚发现的一个疑问,我目前程序的流程是这样的,先在主窗口计算文件的大小,并且路径,然后在打开子窗口的时候去按照大小和路径去实例化那么大一个数组来存数据,此时才开始读到内存中去,但是我想关闭窗口的时候,为什么它占用的内存没有释放掉呢?子窗口Dispose,GC,都没用,网上很多资料都说是因为.net的垃圾回收机制并不会马上起作用,如果子窗口的其他地方还有对数据源的引用,即使关闭窗口了还是不会释放那块内存的,可是我的情况并不是这样,我的子窗口下面虽然还有子窗口,但是我现在还没去打开,应该就不会有引用,对不?
调试的时候发现,我关闭窗口,在FormClosing里面把线程,还有把存数据的数组都Clear了,最后回到主窗口看了下子窗口对象,那个数组还是存在的,不知道这是什么情况。打开窗口是在主窗口声明一个对象,按下打开的时候,实例化它的。
问题还没解决,你这个东西,下面的FlushMemory()是什么时候执行的呀?