我在2个Windows服务上工作,有一个公共数据库,我想用系统互斥锁(跨进程)。
现在我想知道是否可以在try-finally
块中调用WaitOne()
和ReleaseMutex()
,或者我也应该处理互斥锁(例如在using
块中)。如果是这样,我想我应该总是在WaitOne()
方法上捕获AbandonedMutexException
,或者我在这里错了吗?
互斥锁是一个Windows内核对象(这里包装在。net对象中)。
因此,它是一个应该被处置的非托管资源。
更准确地说,. net对象包含一个互斥锁的HANDLE,必须以某种方式释放/处理。
我不相信互斥锁类文档中的代码示例,互斥锁对象没有被处理。尽管Henzi在注释中有一个很好的观点:Mutex对象是静态的,当进程退出时,它要么被终结器处理掉,要么被Windows内核销毁。
还要注意,Close()也会处理对象。
当然,在你的应用程序中保留一个现有的互斥对象并没有什么错,即使你不使用它。
当最后一个持有该互斥锁的HANDLE
的进程结束时,一个名为Mutex
的互斥锁将自动销毁。
在非托管术语中MSDN表示
使用
CloseHandle
函数关闭句柄。当进程终止时,系统自动关闭句柄。当互斥对象的最后一个句柄被关闭时,互斥对象将被销毁。
在。net中,你应该在Mutex
上调用.Close()
——这会释放HANDLE
…因为每个进程在访问甚至相同命名的Mutex
时都得到自己的HANDLE
,这是一致的做法…不调用Close()
不会在进程结束后留下任何问题(finalizer和所有)…
您需要释放等待句柄所使用的资源。
来自文档:
释放WaitHandle当前实例所使用的所有资源类。(继承自WaitHandle.)
等待句柄使用非托管资源,这些资源应该在使用结束时被处置。
MSDN文档互斥