1.单实例运行
[STAThread]
static
void
Main() {
bool
isAppRunning =
false
;
System.Threading.Mutex mutex =
new
System.Threading.Mutex(
true
,System.Diagnostics.Process.GetCurrentProcess().ProcessName,
out
isAppRunning);
if
(!isAppRunning) {
MessageBox.Show(
"本程序已经在运行了,请不要重复运行!"
);
Environment.Exit(1);
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(
false
);
Application.Run(
new
Form1());
}
}
2.
我们在做程序时,有时候希望在一台电脑上面只有一个进程实例在运行,利用Mutex互斥量可以实现了这个功能,方法及步骤如下:
关于互斥量Mutex的理解及用法可以参考博客http://blog.csdn.net/xwdpepsi/article/details/6346890
接下来分控制台程序和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
-
}
运行结果,在打开一个实例的情况下,再次运行该程序则弹出对话框
3.
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "ThisShouldOnlyRunOnce");//根据ThisShouldOnlyRunOnce名字多进程访问mutex