我们在做程序时,有时候希望在一台电脑上面只有一个进程实例在运行,利用Mutex互斥量可以实现了这个功能,方法及步骤如下:
接下来分控制台程序和Winform程序两种情况下实现此功能
1.控制台程序
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- namespace myConApp
- {
- class Test
- {
- /// <summary>
- /// 应用程序的主入口点。
- /// </summary>
- [STAThread]
- static void Main(string[] args)
- {
- bool flag = false;
- System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);
- //第一个参数:true--给调用线程赋予互斥体的初始所属权
- //第一个参数:互斥体的名称
- //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
- if (flag)
- {
- Console.Write("Running");
- }
- else
- {
- Console.Write("Another is Running");
- System.Threading.Thread.Sleep(5000);//线程挂起5秒钟
- Environment.Exit(1);//退出程序
- }
- Console.ReadLine();
- }
- }
- }
运行以上代码生成的应用程序第一个实例,会得到结果
Running
保持第一个运行状态,运行第二个实例,得到结果
Another is Running
以上代码中创建了一个mutex,从其参数的解释中得知,第一个调用线程将得到互斥体的初始所属权,如果不释放的话,其他的线程得不到互斥体所有权
2.Winform程序
Winform程序可以在构造函数中添加以下代码即可实现,如下
- public Form1()
- {
- InitializeComponent();
- #region 只能运行一个客户端程序
- bool flag = false;
- System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);
- //第一个参数:true--给调用线程赋予互斥体的初始所属权
- //第一个参数:互斥体的名称
- //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
- if (!flag)
- {
- MessageBox.Show("只能运行一个客户端程序!", "请确定", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- Environment.Exit(1);//退出程序
- }
- #endregion
- }
运行结果,在打开一个实例的情况下,再次运行该程序则弹出对话框