关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
有些时候需要程序只能运行一个实例(包括窗体和类)。像大部分杀毒软件,我们打开一次之后,再打开发现会自动弹出我们之前打开的界面。因为像这类软件占用资源比较多,所以运行一个实例就行了,比较节省资源而且方便控制。
这个也就是为什么有时候需要只运行一个实例。
先来说说类这么实现单例模式。这个很简单,你可以把这个类改成静态类就行,或者使用静态变量这种东西。
class ClsTest { private static ClsTest _instance; //把默认构造函数改成私有的,避免不小心用到 private ClsTest(){} //通过该静态方法获取实例 public static ClsTest GetInstance() { if(_instance == null) { _instance = new ClsTest(); } return _instance; } }
接下来,再说一下窗体。虽然窗体也是类,但是窗体关闭就释放掉资源,不能一直用下去。如下代码:
public partial class FrmTest : Form { private static FrmTest _instance; private FrmTest() { InitializeComponent(); FrmTest._instance = this; } public static FrmTest GetInstance() { if(FrmTest._instance == null) { FrmTest._instance = new FrmTest(); } return FrmTest._instance; } //窗体关闭的时候,释放掉这个对象 private void FrmTest_FormClosed(object sender, FormClosedEventArgs e) { FrmTest._instance = null; } }
最后,再说一下整个程序的单例模式。这个就要复杂一些了。在Program.cs入口处加如下代码:
Process[] processes = System.Diagnostics.Process.GetProcessesByName(Application.CompanyName); if (processes.Length > 1) { MessageBox.Show("应用程序已经在运行中。。"); Thread.Sleep(1000); System.Environment.Exit(1); } else { Application.Run(new FrmMain()); }
该方法是通过进程名判断是否有同名进程存在。当然还有其他方法可以实现单例模式,大家可以尝试一下。