在C# WinForms应用程序中,检查程序是否已经启动(即防止程序打开多个实例)通常有几种方法。以下是两种常见的方法:
方法1:使用进程名称检查
这种方法涉及遍历所有正在运行的进程,查找与当前应用程序名称匹配的进程。然而,这种方法可能不够准确,因为可能有同名但不属于同一实例的进程。
Csharp
深色版本
1using System;
2using System.Diagnostics;
3using System.Windows.Forms;
4
5static class Program
6{
7 [STAThread]
8 static void Main()
9 {
10 var processName = System.IO.Path.GetFileNameWithoutExtension(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
11 var processes = Process.GetProcessesByName(processName);
12
13 if (processes.Length > 1)
14 {
15 MessageBox.Show("程序已经在运行!");
16 Environment.Exit(0);
17 }
18 else
19 {
20 Application.EnableVisualStyles();
21 Application.SetCompatibleTextRenderingDefault(false);
22 Application.Run(new MainForm());
23 }
24 }
25}
方法2:使用互斥对象(Mutex)
互斥对象(Mutex)是一种同步原语,可以用来确保在同一时间内只有一个进程可以访问共享资源。当你创建一个Mutex时,如果该Mutex已经存在,那么创建者就会被阻塞直到Mutex可用,或者返回false,这样你就可以知道程序是否已经运行。
Csharp
深色版本
1using System;
2using System.Threading;
3using System.Windows.Forms;
4
5static class Program
6{
7 private static Mutex mutex;
8
9 [STAThread]
10 static void Main()
11 {
12 mutex = new Mutex(true, "{YourUniqueMutexName}");
13
14 if (!mutex.WaitOne(0, false))
15 {
16 MessageBox.Show("程序已经在运行!");
17 }
18 else
19 {
20 try
21 {
22 Application.EnableVisualStyles();
23 Application.SetCompatibleTextRenderingDefault(false);
24 Application.Run(new MainForm());
25 }
26 finally
27 {
28 mutex.ReleaseMutex();
29 }
30 }
31 }
32}
在使用Mutex时,你需要给它一个唯一的GUID或名称,以确保不会与其他应用程序的Mutex混淆。在上述代码中,我使用了一个字符串 {YourUniqueMutexName}
作为Mutex的名称,你需要替换它为一个真正唯一的名字。
此外,不要忘记在应用程序退出时释放Mutex,否则其他实例可能仍然无法启动,直到第一个实例完全终止。在上面的代码中,这是通过在finally块中调用 ReleaseMutex()
方法来实现的。这保证了即使在发生异常的情况下,Mutex也会被正确释放。