使.NET程序只运行单一实例
{ Posted on 星期二, 七月 14, 2009
by Kaiser.XKw
}
有时你会想只运行一个程序首次运行时的实例,那么你如何才能确保只有一个.NET的程序运行在你的机器上呢?多任务操作系统在很多方面都很有用,但是有时你只需要在某一时间内运行一个实例,例如,如果程序需要使用很多的资源或者需要排它地存取某一个资源。在这种情况下,你可能想确认当另一个实例启动时,它会检查是否有另一个实例正在运行。如果是,则将自身关闭。本文中,我会告诉大家如何去实现它。
最简单的方法是使用mutex对像。例如,在以下的代码中,Form的构造函数中创建了一个mutex对象,然后 试着去存取它。如果WaitOne()返回true,那么当前线程就已经拥有了mutex,如果返回false则mutex已经被另一个线程所拥有。
程序代码
using System;
using System.Windows.Forms;
using System.Threading;
class TestApp : Form
{
Mutex mutex;
TestApp()
{
Text = "Single Instance!";
mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
if (!mutex.WaitOne(0, false))
{
mutex.Close();
mutex = null;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
mutex.ReleaseMutex();
base.Dispose(disposing);
}
static void Main()
{
TestApp objApp = new TestApp();
if (objApp.mutex != null)
{
Application.Run(objApp);
}
else
{
MessageBox.Show("Instance already running");
objApp.Dispose();
}
}
}
另一个办法是在当前的进程列表中去查找是否有从当前EXE运行的进程,思路和第一种方式是类似的,只是将mutext换成进程查找而已,下面只给出进程查找的核心代码:
程序代码
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//遍历正在有相同名字运行的例程
foreach (Process process in processes)
{
//忽略现有的例程
if (process.Id != current.Id)
{
//确保例程从EXE文件运行
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==
current.MainModule.FileName)
{
//返回另一个例程实例
return process;
}
}
}
//没有其它的例程,返回Null
return null;
}
No Response to "使.NET程序只运行单一实例"
发表评论