在实际应用中为了避免操作人员误操作,我们需要设置一个应用程序只能运行一个实例。


方法一:

这个方法相对比较霸道,无论程序是原路径下还是复制出来的,一台电脑只能运行一个实例。

bool createnew = false;
Mutex mutex = new Mutex(true, "consoleTest", out createnew);
if (createnew)
{
Console.WriteLine("This is new one");
}
else
{
Console.WriteLine("当前已经运行了一个实例");
}

首先创建了一个互斥体“consoleTest”。

如果成功创建了互斥体,则方法返回为true;如果指定生成的互斥体已经存在,则方法返回为false。

可以看到下图中有位于不同路径下的两个实例,第一个程序打开时会提示“This is new one”,而之后打开的实例则将提示"当前已经运行了一个实例"

C# 程序只运行一个实例_应用程序

不同路径下的首次运行结果

方法二:

但是也有另外一个场景,当前程序只能生成一个实例,但是复制出来的副本可以再生成一个实例。那就可以用下面的方法来实现

Process current_process = Process.GetCurrentProcess();
Process[] processes = Process.GetProcesses();

int count = 0;
foreach (Process process in processes)
{
if (current_process.Id != process.Id)
{
try
{
if (current_process.MainModule.FileName.Equals(process.MainModule.FileName))
{
Console.WriteLine("当前已经运行了一个实例");
count++;
}
}
catch (Exception)
{
}

}
}

if (count == 0)
{
//如果相同路径下没有运行实例
Console.WriteLine("This is new one");
}

可以看到下图中依旧是不同路径下的两个实例,但是运行之后都提示了"This is new one"

C# 程序只运行一个实例_.NET_02

不同路径下的首次运行结果


当然在实际应用中一般都是不会给提示的,而是直接根据结果决定是否运行程序还是直接退出。