需求来源:
在中大型工程的编写过程中发现,当对象的实例化过多的情况下会导致系统内存的缓慢增加,对于需要长时间打开的软件,同时可能还调用了一些无法得到源码的动态链接库的时候,可能需要一个简单的方法来处理这个问题。首先可以想到的简单的解决办法是,断开Client和Server的连接,从而释放连接资源,同时将Form最小化,释放刷新的资源。
修改办法:
函数:
1 // 创建结构体用于返回捕获时间 2 [StructLayout(LayoutKind.Sequential)] 3 struct LASTINPUTINFO 4 { 5 // 设置结构体块容量 6 [MarshalAs(UnmanagedType.U4)] 7 public int cbSize; 8 // 捕获的时间 9 [MarshalAs(UnmanagedType.U4)] 10 public uint dwTime; 11 } 12 [DllImport("user32.dll")] 13 private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 14 // 获取键盘和鼠标没有操作的时间 15 private static long GetLastInputTime() 16 { 17 LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO(); 18 vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo); 19 // 捕获时间 20 if (!GetLastInputInfo(ref vLastInputInfo)) 21 return 0; 22 else 23 return Environment.TickCount - (long)vLastInputInfo.dwTime; 24 }
调用:
1 private void timerLastInput_Tick(object sender, EventArgs e) 2 { 3 //若15分钟没有操作则断开连接 4 if (CustomClass.GetLastInputTime() > 900000) 5 { 6 RefreshUI(); 7 this.WindowState = FormWindowState.Minimized; 8 } 9 }
此处定义的Timer是10分钟的,只有当连接的时候才去Enable,断开就Disable。
当鼠标键盘不活动的时候,首先刷新下界面,使其呈现为断开的状态,其次将窗体最小化,释放资源。