我应该处理Mutex吗?

我正在开发2个Windows服务,它有一个公共数据库,我想用系统Mutex锁定(交叉处理)。

现在我想知道在try-finally块中调用WaitOne()ReleaseMutex() ,或者我是否也应该using Mutex(例如在using块中)。 如果是这样我想我应该总是在WaitOne()方法上捕获AbandonedMutexException ,或者我错在这里?

互斥锁是Windows内核对象(此处包含在.NET对象中)。

因此,它应该是一种非托管资源。

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

我不相信Mutex类docs中没有处理互斥对象的代码示例 。 尽管Henzi在评论中有一个很好的观点:Mutex对象是静态的,并且在进程退出时由终结器处理或由Windows内核销毁。

另请注意, Close()也会处理该对象。

当然,即使您不使用它,在应用程序中保留现有Mutex对象也没有错。 它们是轻资源。

根据这个,当持有该互斥锁的HANDLE的最后一个进程结束时,一个命名的Mutex被自动销毁。

MSDN表示,在非托管条款中

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

在.NET中,您应该在Mutex上调用.Close() – 这会释放HANDLE …因为每个进程在访问同一个名为Mutex时都会获得自己的HANDLE这是一致的做法…不会调用Close()一旦这个过程不复存在,就会留下任何问题(终结者和所有人)……

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

从文档:

释放WaitHandle类的当前实例使用的所有资源。 (inheritance自WaitHandle。)

waithandle使用非托管资源,应在使用结束时进行处理。

MSDN文档Mutex