保证一个应用程序在系统中只有一个运行的方式就是用一些特殊的信息来判定唯一性。一种思路是通过线程的信息,比如名字等来判断,另一种是通过线程同步互斥信号来达到目的。
第一种是查看线程的名字,看是否已经存在了:
using System.Diagnostics;
namespace OnlyOneInstanceApp
{
class Program
{
static void Main(string[] args)
{
if (Process.GetProcessesByName
(Process.GetCurrentProcess().ProcessName).Length > 1)
{
return;
}
}
}
}
这种方式不太严谨,首先如果两个程序同时运行,可能会检测不出同名然后继续运行。另外多个终端里名字是唯一的,这个方法不能检测出来。
第二种是通过 Mutex
对象来实现:
using System;
using System.Threading;
namespace OnlyOneInstanceApp
{
class Program
{
private static Mutex mutex;
static void Main(string[] args)
{
bool aIsNewInstance;
mutex = new Mutex(true, @"Global\" + "OnlyOneInstanceApp", out aIsNewInstance);
GC.KeepAlive(mutex);
if (!aIsNewInstance)
{
Console.WriteLine("该程序已经在系统中运行");
Console.ReadKey();
return;
}
}
}
}
上述代码中,通过 Mutex
类来创建一个命名的线程间互斥锁,当其他程序也在试图创建同名的锁时,Mutex
构造函数返回的 out 参数 createdNew
会返回 false
。名字的前缀"Global" 保证在不同的终端运行时有一个唯一名字。GC.KeepAlive(mutex)
是为了防止 GC 觉得 mutex
在上一句之后不再被引用而被回收。