C# 跨进程 临界区 互斥 进程锁
namespace System
{using System.Diagnostics;using System.Threading;/// <summary>/// 跨进程的临界区。/// </summary>public sealed class ProcessLocker : IDisposable{/// <summary>/// 使用示例。/// </summary>[Conditional("DEBUG")]public static void Test(){using (new ProcessLocker("TestLocker")) // 成功进入跨进程临界区。{// 跨进程的临界区。} // 成功退出跨进程临界区。}public ProcessLocker(string name){try{this.name = name;bool createdNew;// 尝试创建或打开现有的命名Mutex。this.mutex = new Mutex(true, name, out createdNew);// 如果Mutex已存在,则尝试获取所有权if (!createdNew){// 没有获取所有权期间,阻塞this.IsWaitOne = this.mutex.WaitOne(-1);}else{// 新创建的Mutex,已拥有所有权this.IsWaitOne = true;}}catch (AbandonedMutexException){// 前任所有者未释放Mutex,当前线程获得所有权this.IsWaitOne = true;}catch (Exception ex){Trace.WriteLine($"Process locker init {name} exception: " + ex);}}~ProcessLocker(){Dispose(false);}private readonly string name;private readonly Mutex mutex;public bool IsDisposed { get; private set; }public bool IsWaitOne { get; private set; }public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}private void Dispose(bool disposing){if (!IsDisposed){IsDisposed = true;if (mutex != null && IsWaitOne){try{// 释放Mutex并销毁资源mutex.ReleaseMutex();if (disposing){(mutex as IDisposable)?.Dispose();}}catch (Exception ex){Trace.WriteLine($"Process locker dispose {name} exception: " + ex);}}}}}
}以下是对提供的 ProcessLocker 代码的主要内容和优点的分析:
主要内容
-  跨进程临界区实现 
 通过命名Mutex(互斥体)实现跨进程的同步锁,确保多个进程或线程中只有一个能进入临界区代码块。适用于需要全局资源独占访问的场景。
-  基于 IDisposable的资源管理
 类实现IDisposable接口,利用using语句自动释放锁,避免资源泄漏。通过Dispose()方法确保Mutex的释放和销毁。
-  异常处理机制 - 捕获 AbandonedMutexException:处理前一个进程未正确释放锁的情况,当前线程直接获得所有权。
- 记录其他异常(如权限不足、命名冲突等),避免进程崩溃。
 
- 捕获 
-  状态跟踪 - IsWaitOne属性标记是否成功获取锁。
- IsDisposed属性标识对象是否已释放,防止重复释放资源。
 
-  调试支持 - 提供 Test()方法(仅在DEBUG模式下编译),作为使用示例,帮助开发者快速理解用法。
 
- 提供 
代码优点
-  封装性与易用性 
 将底层的Mutex操作封装成简洁的ProcessLocker类,用户只需通过using块即可实现跨进程同步,无需直接处理Mutex的复杂性。
-  健壮的资源管理 - 结合 IDisposable和终结器(~ProcessLocker()),确保即使未显式调用Dispose(),资源也会在垃圾回收时释放。
- 使用 GC.SuppressFinalize优化性能,避免重复释放。
 
- 结合 
-  异常鲁棒性 - 处理 AbandonedMutexException避免因前序进程崩溃导致的死锁。
- 在构造函数和 Dispose中捕获异常并记录日志,提升系统稳定性。
 
- 处理 
-  跨进程支持 
 基于命名Mutex的机制天然支持跨进程同步,适用于多进程协作场景(如单实例应用、共享文件访问等)。
-  调试友好性 
 Test()方法提供直观的使用示例,配合Conditional("DEBUG")特性,确保示例代码仅在调试时编译,不影响生产环境。
-  状态反馈 
 IsWaitOne属性允许调用者检查是否成功获取锁,便于后续逻辑处理或错误排查。
潜在改进点
-  全局命名空间支持 
 Windows 系统下,跨会话的全局Mutex需添加Global\前缀(如Global\TestLocker)。当前代码未显式处理,可能限制跨会话使用。
-  锁获取失败处理 
 构造函数中若WaitOne失败(如超时),IsWaitOne会为false,但未提供显式错误通知机制,调用者需主动检查该属性。
-  线程安全增强 
 可进一步确保多线程环境下Dispose()的原子性,但现有代码通过IsDisposed标记已具备基础防护。
总结
该 ProcessLocker 类是一个高效、健壮的跨进程同步工具,通过封装 Mutex 和资源管理机制,简化了多进程环境下的临界区控制。其异常处理和状态跟踪设计使其适合高可靠性场景,而清晰的接口和调试支持则降低了使用门槛。
