我正在开发 2 个 Windows 服务,它们有一个公共数据库,我想用系统互斥锁锁定(跨进程)。
现在我想知道在一个块中调用WaitOne()
and是否可以,或者我是否应该也处理 Mutex(例如在一个块中)。如果是这样,我想我应该总是抓住方法,还是我错了?ReleaseMutex()
try-finally
using
AbandonedMutexException
WaitOne()
我正在开发 2 个 Windows 服务,它们有一个公共数据库,我想用系统互斥锁锁定(跨进程)。
现在我想知道在一个块中调用WaitOne()
and是否可以,或者我是否应该也处理 Mutex(例如在一个块中)。如果是这样,我想我应该总是抓住方法,还是我错了?ReleaseMutex()
try-finally
using
AbandonedMutexException
WaitOne()
互斥体是一个 Windows 内核对象(这里包装在一个 .NET 对象中)。
因此,它是一个应该被释放的非托管资源。
更准确地说,.NET 对象包含互斥体的句柄,必须以某种方式释放/处置。
我不信任未处理互斥对象的 Mutex 类文档中的代码示例。尽管 Henzi 有一个很好的评论点:Mutex 对象是静态的,并且会在进程退出时由终结器处置或由 Windows 内核销毁。
另外,请注意Close()也会处理该对象。
当然,即使您不使用现有的 Mutex 对象,在您的应用程序中保留它也没有错。它们是轻资源。
您需要处理等待句柄使用的资源。
从文档中:
释放 WaitHandle 类的当前实例使用的所有资源。(继承自 WaitHandle。)
等待句柄使用非托管资源,应在使用结束时处理。