(一)单例模式:
在Winform窗体中,经常进行的一个操作就是在点击一个按钮的时候要求只打开一个窗体,这个时候就涉及到所谓的单例模式。所谓
的单例模式就是对于一个类在进行实例化的时候,始终只能有一个实例。最简单的方式就是根据C#的一个基础知识点,即每个类的静态成员对
于类的实例是共享的,类的实例统一对应着同一个静态类成员,因此可以采用定义一个窗体类类型的一个变量,然后来再进行逻辑操作。下面是示例代码
被调用窗体中的代码:
public static FormTest newForm = null; //声明一个静态窗体类变量并得对其初始化为null
被调用窗体中的代码:
public static FormTest newForm = null; //声明一个静态窗体类变量并得对其初始化为null
/// <summary>
/// 定义一个返回值为窗体类的静态方法用来对窗体执行单态式
/// </summary>
/// <returns></returns>
public static FormTest GetInstance()
{
if (newForm == null || newForm.IsDisposed == true) //newForm.IsDIsposed==true必需,否则会出现“访问已释放资源”的异常
{
newForm = new FormTest();//实例化当前窗体
}
else
{
newForm.Activate();//当前窗体激活
}
return newForm;
}
预调用的窗体中的代码:
FormTest newForm = FormTest.GetInstance();//实例化一个被调用的窗体类,并调用被调用窗体类的单态模式方法对类的实例进行赋值
newForm.Show(); //打开窗体
(二)单进程操作
常常会有这么一个需求,就是要求在当我们软件发布上线以后。客户点击桌面上的系统启动图标的时候,要求多次点击快捷方式的图
/// 定义一个返回值为窗体类的静态方法用来对窗体执行单态式
/// </summary>
/// <returns></returns>
public static FormTest GetInstance()
{
if (newForm == null || newForm.IsDisposed == true) //newForm.IsDIsposed==true必需,否则会出现“访问已释放资源”的异常
{
newForm = new FormTest();//实例化当前窗体
}
else
{
newForm.Activate();//当前窗体激活
}
return newForm;
}
预调用的窗体中的代码:
FormTest newForm = FormTest.GetInstance();//实例化一个被调用的窗体类,并调用被调用窗体类的单态模式方法对类的实例进行赋值
newForm.Show(); //打开窗体
(二)单进程操作
常常会有这么一个需求,就是要求在当我们软件发布上线以后。客户点击桌面上的系统启动图标的时候,要求多次点击快捷方式的图
标只会启动一次我们的应用程序。下面是提供两种简单的方式都可以解决这个问题
方法一:计算进程数目
实例代码:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//在应用程序启动的时候,获得我们当前的进程的名字
string proc = Process.GetCurrentProcess().ProcessName;
//通过我们已经获得进程名字取到所有的进程,并把这些进程放到一个Process类型的数组中
Process[] processes = Process.GetProcessesByName(proc);
//如果数组的长度大于1的话,则表示有多个进程在运行,给出一个提示
if (processes.Length > 1)
{
MessageBox.Show("程序已经运行!");
return;
}
else
{
Application.Run(new MyForm());
}
方法二:通过互斥体来解决
方法一:计算进程数目
实例代码:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//在应用程序启动的时候,获得我们当前的进程的名字
string proc = Process.GetCurrentProcess().ProcessName;
//通过我们已经获得进程名字取到所有的进程,并把这些进程放到一个Process类型的数组中
Process[] processes = Process.GetProcessesByName(proc);
//如果数组的长度大于1的话,则表示有多个进程在运行,给出一个提示
if (processes.Length > 1)
{
MessageBox.Show("程序已经运行!");
return;
}
else
{
Application.Run(new MyForm());
}
方法二:通过互斥体来解决
实例代码:
bool createdNew; //声明一个bool类型的变量用来接收互斥体的输出参数
Mutex mutex = new Mutex(false, "singletonnWinAppMutex", out createdNew);//实例化互斥体类Mutex,得到输出参数createdNew
if (!createdNew)//如果输出参数为false的时候,则进行以下逻辑操作
{
MessageBox.Show("只能打开一个窗体");//给出一个提示
Application.Exit();//退出当前应用程序
return;//跳出当前函数
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyForm());//传入实例化窗体类实例参数,应用程序启动
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyForm());//传入实例化窗体类实例参数,应用程序启动