C#之Mutex锁与Winform启动文件Program.cs

进程之间的互锁:Mutex锁
作用1:只让启动一个程序,不可重复启动



namespace MjVision
{
    class Program : System.Windows.Application
    {

        public static Mutex mutex;

        /// <summary>
        /// 程序入口
        /// </summary>
        [STAThread]
        public static void Main(string[] args)
        {
            // 只能运行一个软件,禁止重复开启
            mutex = new Mutex(true, "onlyRun");
            
            if (!mutex.WaitOne(0, false))
            {
                System.Windows.Forms.MessageBox.Show("该程序正在运行", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            else
            {
                System.Windows.Application app = new System.Windows.Application();

                //启动窗体
                app.Run(new MainWindow());
            }
        }
    }
}

03-22
### C#Mutex 的用法 在 C# 编程语言中,`Mutex` 是一种同步原语,用于控制多个线程对共享资源的访问。它允许同一进程内的线程或不同进程间的线程协调对公共资源的独占访问[^1]。 #### 创建和初始化 `Mutex` 可以通过两种方式创建 `Mutex` 对象: 1. **无名互斥体 (Unnamed Mutex)** 这种类型的互斥体仅限于在同一进程中使用的线程之间进行同步。 ```csharp Mutex mutex = new Mutex(); ``` 2. **命名互斥体 (Named Mutex)** 命名互斥体可以在不同的应用程序或进程间使用。通过指定相同的名称,可以跨进程实现资源共享。 ```csharp Mutex mutex = new Mutex(false, "GlobalUniqueName"); ``` #### 使用 `Mutex` 同步代码块 为了确保多线程环境下的安全操作,通常会围绕可能引发竞争条件的关键部分包裹 `mutex.WaitOne()` 和 `mutex.ReleaseMutex()` 方法调用。 ```csharp class Program { private static Mutex _mutex = new Mutex(); public static void Main() { Thread thread1 = new Thread(WriteMessage); Thread thread2 = new Thread(WriteMessage); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); } public static void WriteMessage() { _mutex.WaitOne(); // 请求 Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is writing."); // 模拟耗时操作 System.Threading.Thread.Sleep(1000); Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} has finished writing."); _mutex.ReleaseMutex(); // 释放 } } ``` 上述示例展示了如何利用 `Mutex` 来防止两个线程同时写入到控制台输出流中[^2]。 #### 跨进程同步 当需要在多个独立的应用程序实例之间同步数据时,可以采用命名互斥体来完成这一目标。下面是一个简单的例子说明其工作原理: ```csharp static void Main(string[] args) { bool createdNew; using (Mutex mutex = new Mutex(true, "MyAppWideResourceLock", out createdNew)) { if (!createdNew) { Console.WriteLine("Another instance of this application is already running!"); return; } Console.WriteLine("Press Enter to exit..."); Console.ReadLine(); } } ``` 在这个场景下,如果另一个具有相同名字的互斥对象已经被其他进程持有,则当前尝试启动的新应用副本会被阻止运行[^3]。 #### 错误处理最佳实践 - 总是在捕获异常之前释放已获取的定,以避免死情况发生。 - 如果某个方法可能会抛出异常而未能正常退出临界区,请考虑使用 try/finally 结构保护您的解逻辑。 ```csharp try { myMutex.WaitOne(); // Critical section code here... } finally { if(myMutex != null && myMutex.WaitOne()) myMutex.ReleaseMutex(); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值