实现原理: 在程序启动时,请求一个互斥体,如果能获取对指定互斥的访问权,就继续运行程序,否则就退出程序。
测试代码:
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",五秒钟后,程序自动退出。
我项目中的实例:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
/*--------------------判断程序是否已经启动--------------------------*/
Mutex mutex = new Mutex(false, "ShangGuSys");
bool running = !mutex.WaitOne(0, false);
if (running)
{
MessageBox.Show("应用程序已经启动!", "环太ERP!", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
/*--------------------End----------------------------------------*/
//if (!LoginServer())//登录连接服务器,解决部分计算机访问服务器要输入用户名和密码的问题
// MessageBox.Show("连接服务器失败,软件可能无法正常使用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
if (LiveUpdate.VerifyLiveUpdateFile() == 1)//如果本地为旧文件则启动升级
{
System.Diagnostics.Process.Start("ShangGu.Update.exe");
Application.Exit();
return;
}
Frm_Login fl = new Frm_Login();
fl.Activate();
fl.ShowDialog();
if (fl.LoginSuccess)//用户名和密码验证成功
{
Splash.Show();
DoStartup(args);
}
}