C# Winform检查本程序是否已经启动的方法

在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也会被正确释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值