我应该处置一个Mutex吗?
我正在使用2个Windows服务,这些服务具有一个公用数据库,我想用系统互斥锁来锁定(跨进程)。我应该处置一个Mutex吗?
现在,我不知道是否它的确定只是调用WaitOne()
和ReleaseMutex()
在try-finally
块或者我应该也配置互斥(例如在using
块)。如果是这样,我想我应该总是赶上WaitOne()
方法AbandonedMutexException
或我错了吗?
互斥体是Windows内核对象(这里,裹在.NET对象)。
因此,这是一个非托管资源,应予以处置。
更准确地说,.NET对象包含对互斥锁的HANDLE,它必须以某种方式释放/处置。
我不相信code sample in the Mutex class docs其中互斥对象不处理。虽然Henzi在评论中有一个很好的观点:Mutex对象是静态的,当进程退出时,它会被终结器处理或被Windows内核销毁。
另外,请注意Close()也配置了该对象。
当然,即使不使用它,在应用程序中保留现有的Mutex对象也没什么问题。他们是轻资源。
还没有代码示例,你必须链接它:http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –
完成。下一次,随时编辑我的答案;-) –
但是,因为我创建Windows服务,我想我不应该在我的服务(总是)的“运行时”期间处置。每次创建一个具有相同名称的新Mutex实例会将相同的非托管实例包装在一起?还是会反复创建新的非托管资源?我可以关闭互斥锁,当我的一个服务停止真正清理它可能吗? – Koen
您需要处理waithandle使用的资源。
从文档:
释放由WaitHandle的 类的当前实例使用的所有资源。 (继承WaitHandle。)
等待句柄使用非托管资源,应在使用结束时使用非托管资源。
您需要AbandonedMutexException来告诉您拥有该互斥锁的服务已意外终止。在这种情况下,您*有*停止使用数据库并等待其他服务重新启动。使用第三个流程来充当仲裁者将是明智的。 –