关于本站
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());
}该方法是通过进程名判断是否有同名进程存在。当然还有其他方法可以实现单例模式,大家可以尝试一下。