占用的内存会 不断 向上飙升,即使你结束了长时间运行的操作.这种情况对于一个非常小的应用都是这样.
这种情况一般并不是.Net 内存泄露,而是因为.Net没有即时回收你分配的内存。下面是从一个朋友那儿搞到的一段代码,
它能够帮助你即时回收内存.
public
class
RevokeMemory
{
public static void ReduceMemoryFootPrint()
{
int currentMinWorkingSetValue = 0 ;
int currentMaxWorkingSetValue = 0 ;
Process currentProcess = Process.GetCurrentProcess();
try
{
if (GetProcessWorkingSetSize(currentProcess.Handle, out currentMinWorkingSetValue, out currentMaxWorkingSetValue))
{
currentProcess.MinWorkingSet = (IntPtr)currentMinWorkingSetValue;
}
}
catch (Exception err)
{
string additionalInfo = " MinWorkingSet value is set to: " + currentMinWorkingSetValue.ToString();
additionalInfo += " Process In Error: " + currentProcess.ProcessName;
// Log error message
}
}
[DllImport( " kernel32.dll " )]
public static extern bool GetProcessWorkingSetSize( IntPtr proc, out int min, out int max );
[DllImport( " kernel32.dll " )]
public static extern bool SetProcessWorkingSetSize( IntPtr proc, int min, int max );
}
{
public static void ReduceMemoryFootPrint()
{
int currentMinWorkingSetValue = 0 ;
int currentMaxWorkingSetValue = 0 ;
Process currentProcess = Process.GetCurrentProcess();
try
{
if (GetProcessWorkingSetSize(currentProcess.Handle, out currentMinWorkingSetValue, out currentMaxWorkingSetValue))
{
currentProcess.MinWorkingSet = (IntPtr)currentMinWorkingSetValue;
}
}
catch (Exception err)
{
string additionalInfo = " MinWorkingSet value is set to: " + currentMinWorkingSetValue.ToString();
additionalInfo += " Process In Error: " + currentProcess.ProcessName;
// Log error message
}
}
[DllImport( " kernel32.dll " )]
public static extern bool GetProcessWorkingSetSize( IntPtr proc, out int min, out int max );
[DllImport( " kernel32.dll " )]
public static extern bool SetProcessWorkingSetSize( IntPtr proc, int min, int max );
}
调用的时机:
1. 主界面上做一个计时器,每间隔一定的时间进行调用,但鄙人认为这种效果并不好。在你进行长时间运行的操作之前。需要禁止它。
2.每完成一个大的操作或者比较消耗内存的操作之后,调用。
本人做了一个测试,以前几时兆的内存飙升,现在总的消耗的内存都在几兆到30兆之间了.
不信你可以试一试.