在实际应用中为了避免操作人员误操作,我们需要设置一个应用程序只能运行一个实例。 方法一: 这个方法相对比较霸道,无论程序是原路径下还是复制出来的,一台电脑只能运行一
在实际应用中为了避免操作人员误操作,我们需要设置一个应用程序只能运行一个实例。
方法一:
这个方法相对比较霸道,无论程序是原路径下还是复制出来的,一台电脑只能运行一个实例。
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”,而之后打开的实例则将提示"当前已经运行了一个实例"
不同路径下的首次运行结果
方法二:
但是也有另外一个场景,当前程序只能生成一个实例,但是复制出来的副本可以再生成一个实例。那就可以用下面的方法来实现
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"
不同路径下的首次运行结果
当然在实际应用中一般都是不会给提示的,而是直接根据结果决定是否运行程序还是直接退出。