2011-08-18 27 views
10

我正在使用2个Windows服务,这些服务具有一个公用数据库,我想用系统互斥锁来锁定(跨进程)。我应该处置一个Mutex吗?

现在,我不知道是否它的确定只是调用WaitOne()ReleaseMutex()try-finally块或者我应该也配置互斥(例如在using块)。如果是这样,我想我应该总是赶上WaitOne()方法AbandonedMutexException或我错了吗?

+0

您需要AbandonedMutexException来告诉您拥有该互斥锁的服务已意外终止。在这种情况下,您*有*停止使用数据库并等待其他服务重新启动。使用第三个流程来充当仲裁者将是明智的。 –

回答

12

互斥体是Windows内核对象(这里,裹在.NET对象)。

因此,这是一个非托管资源,应予以处置。

更准确地说,.NET对象包含对互斥锁的HANDLE,它必须以某种方式释放/处置。

我不相信code sample in the Mutex class docs其中互斥对象不处理。虽然Henzi在评论中有一个很好的观点:Mutex对象是静态的,当进程退出时,它会被终结器处理或被Windows内核销毁。

另外,请注意Close()也配置了该对象。

当然,即使不使用它,在应用程序中保留现有的Mutex对象也没什么问题。他们是轻资源。

+0

还没有代码示例,你必须链接它:http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –

+1

完成。下一次,随时编辑我的答案;-) –

+0

但是,因为我创建Windows服务,我想我不应该在我的服务(总是)的“运行时”期间处置。每次创建一个具有相同名称的新Mutex实例会将相同的非托管实例包装在一起?还是会反复创建新的非托管资源?我可以关闭互斥锁,当我的一个服务停止真正清理它可能吗? – Koen

2

您需要处理waithandle使用的资源。

从文档:

释放由WaitHandle的 类的当前实例使用的所有资源。 (继承WaitHandle。)

等待句柄使用非托管资源,应在使用结束时使用非托管资源。

MSDN Documentation Mutex

6

根据this,当最后一个持有该互斥锁的HANDLE的进程结束时,会自动销毁一个名为Mutex

在非管理方面MSDN说

使用CloseHandle功能关闭句柄。当进程终止时,系统自动关闭句柄。互斥对象在最后一个句柄关闭时被销毁。

在.NET中,你应该呼吁Mutex.Close() - 这释放了HANDLE ...因为访问甚至相同的命名Mutex这是一贯做法时......不叫Close()韩元”每个进程都有自己的HANDLE如果没有更多(终结器和所有的)进程,则不会留下任何问题...

相关问题