我应该解除互斥锁吗?

本文关键字:我应该 | 更新日期: 2023-09-27 18:05:53

我在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文档互斥