方法一.
private Boolean IsFirstInstance()
{
if (System.Diagnostics.Process.GetProcessesByName(Application.ProductName).Length
> 1)
{
return false;
}
return true;
}
方法二
private static bool HaveOtherInstance()
{
try
{
EventWaitHandle globalHandler = EventWaitHandle.OpenExisting("iReaper");
globalHandler.Set();
return true;
}
catch (WaitHandleCannotBeOpenedException)
{
EventWaitHandle global = new EventWaitHandle(true, EventResetMode.AutoReset, "iReaper");
Thread monitor = new Thread(new ThreadStart(delegate()
{
while (true)
{
global.WaitOne();
}
}));
monitor.IsBackground = true;
monitor.Start();
GC.KeepAlive(monitor);
return false;
}
}
方法三
<!--StartFragment-->public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//Loop through the running processes in with the same name
foreach (Process process in processes)
{
//Ignore the current process
if (process.Id != current.Id)
{
//Make sure that the process is running from the exe file.
if (Assembly.GetExecutingAssembly().Location.Replace("/", "//") == current.MainModule.FileName)
{
//Return the other process instance.
return process;
}
}
}
//No other instance was found, return null.
return null;
}
分析:方法一和方法三从本质上说 是一样的,是在当前运行进程中是否存在同名或地址相同进程,若没有则说明程序第一次运行。方法二不同,是在当前进程中另运行一个模块,同时设置一个线程同步变量。程序运行时,查看是否存在某一名称变量。