我正在开发2个Windows服务,它们有一个公共数据库,我想用系统Mutex锁定(交叉处理)。
现在我想知道是否可以在WaitOne()
块中调用ReleaseMutex()
和try-finally
,或者我是否也应该放置互斥锁(例如在using
块中)。如果是这样,我想我应该总是抓住AbandonedMutexException
方法上的WaitOne()
或者我错了吗?
答案 0 :(得分:14)
互斥锁是一个Windows内核对象(此处包含在.NET对象中)。
因此,它应该是一个非托管资源。
更准确地说,.NET对象包含互斥锁的HANDLE,必须以某种方式释放/处理。
我不相信没有处置互斥对象的code sample in the Mutex class docs。虽然Henzi在评论中有一个很好的观点:Mutex对象是静态的,并且在进程退出时由终结器处理或由Windows内核销毁。
另请注意,Close()也会处置该对象。
当然,即使您不使用它,在应用程序中保留现有Mutex对象也没有错。它们是轻资源。
答案 1 :(得分:9)
根据this,当持有该互斥锁的HANDLE
的最后一个进程结束时,会自动销毁已命名的Mutex
。
在非托管条款中,MSDN说
使用
CloseHandle
功能关闭手柄。当进程终止时,系统会自动关闭句柄。当最后一个句柄关闭时,互斥对象将被销毁。
在.NET中,您应该在Mutex
上调用.Close()
- 这会释放HANDLE
...因为每个进程在访问同一个名称时都会获得自己的HANDLE
Mutex
这是一贯的做法......一旦流程不再(终结者和所有人),不会呼叫Close()
不会留下任何问题......
答案 2 :(得分:2)
您需要处理等待句柄使用的资源。
来自文档:
释放WaitHandle当前实例使用的所有资源 类。 (继承自WaitHandle。)
waithandle使用非托管资源,这些资源应在使用结束时处理。