使用互斥体(Mutex)实现单实例
在程序启动时创建一个命名互斥体(Mutex),通过检查互斥体是否已存在来判断是否已有实例运行。以下是实现代码:
using System;
using System.Threading;
class Program
{
static void Main()
{
bool createdNew;
Mutex mutex = new Mutex(true, "Global\\YourUniqueAppName", out createdNew);
if (!createdNew)
{
Console.WriteLine("Another instance is already running.");
return;
}
Console.WriteLine("Application running. Press any key to exit...");
Console.ReadKey();
mutex.ReleaseMutex();
}
}
- 互斥体名称应全局唯一,建议包含公司或开发者名称。
Global\\前缀确保跨会话可见(适用于终端服务环境)。
使用进程名检查实现单实例
通过遍历当前运行的进程,检查是否存在同名进程:
using System.Diagnostics;
class Program
{
static void Main()
{
Process currentProcess = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName);
if (processes.Length > 1)
{
Console.WriteLine("Another instance is already running.");
return;
}
Console.WriteLine("Application running...");
}
}
- 此方法简单但可靠性较低,可能因进程名冲突导致误判。
- 适用于快速原型开发或简单应用。
使用Windows Forms应用的单实例模式
对于Windows Forms应用,可以使用内置的SingleInstance特性:
using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;
class Program : WindowsFormsApplicationBase
{
[STAThread]
static void Main()
{
var app = new Program();
app.IsSingleInstance = true;
app.Run(Environment.GetCommandLineArgs());
}
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
{
MessageBox.Show("Application is already running");
}
}
- 此方法自动处理命令行参数传递。
- 需要引用Microsoft.VisualBasic程序集。
使用文件锁实现单实例
创建一个临时文件作为锁文件,通过文件独占锁判断实例是否已运行:
using System.IO;
class Program
{
static void Main()
{
try
{
using (FileStream fs = new FileStream("YourApp.lock", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
Console.WriteLine("Application running...");
Console.ReadKey();
}
}
catch (IOException)
{
Console.WriteLine("Another instance is already running.");
}
}
}
- 程序退出时会自动释放文件锁。
- 需确保程序正常退出时能删除锁文件。
C#实现单实例程序的方法
1361

被折叠的 条评论
为什么被折叠?



