问题:
互斥锁(Mutex)的使用可能比较棘手,尤其对于全局互斥锁。在C#中创建和使用全局互斥锁的可靠且安全的模式是什么?
答案:
1. 使用唯一标识符:
使用应用程序的GUID创建一个全局互斥锁的唯一标识符。这确保了互斥锁是特定于您的应用程序的,并且不会与其他应用程序冲突。
2. 正确创建和释放:
使用Mutex(bool, string, out bool)
构造函数(其中createdNew
设置为true
)实例化互斥锁。这确保了如果互斥锁不存在则创建它,或者如果它已经存在则获取它。完成后,请务必使用ReleaseMutex()
释放互斥锁。
3. 处理被放弃的互斥锁:
将WaitOne()
调用包装在try/catch
块中以捕获AbandonedMutexException
。当先前持有互斥锁的进程终止而未释放它时,会发生此异常。在这种情况下,可以忽略此异常,并且仍然可以获取互斥锁。
4. 设置安全权限(多用户设置):
如果多个用户将访问该应用程序,请使用MutexSecurity
设置互斥锁的安全设置。向用户组或特定用户授予相应的权限。
5. 处理超时:
不要无限期等待,请考虑为WaitOne()
设置超时。如果无法获取互斥锁,这将防止程序无限期挂起。
代码示例:
// 获取应用程序GUID string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly(). GetCustomAttributes(typeof(GuidAttribute), false). GetValue(0)).Value.ToString(); // 唯一的全局互斥锁ID string mutexId = string.Format("Global\{{{0}}}", appGuid); // 使用安全设置创建或获取互斥锁 var securitySettings = new MutexSecurity(); var allowEveryoneRule = new MutexAccessRule( new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow); securitySettings.AddAccessRule(allowEveryoneRule); using (var mutex = new Mutex(false, mutexId, out bool createdNew, securitySettings)) { bool hasHandle = false; try { hasHandle = mutex.WaitOne(5000, false); // 设置5秒超时 if (!hasHandle) throw new TimeoutException("等待独占访问超时"); } catch (AbandonedMutexException) { hasHandle = true; } // 执行工作 if (hasHandle) mutex.ReleaseMutex(); }
以上是如何在C#中安全可靠地使用全局静音?的详细内容。更多信息请关注PHP中文网其他相关文章!