16

我正在开发 2 个 Windows 服务,它们有一个公共数据库,我想用系统互斥锁锁定(跨进程)。

现在我想知道在一个块中调用WaitOne()and是否可以,或者我是否应该也处理 Mutex(例如在一个块中)。如果是这样,我想我应该总是抓住方法,还是我错了?ReleaseMutex()try-finallyusingAbandonedMutexExceptionWaitOne()

4

3 回答 3

17

互斥体是一个 Windows 内核对象(这里包装在一个 .NET 对象中)。

因此,它是一个应该被释放的非托管资源。

更准确地说,.NET 对象包含互斥体的句柄,必须以某种方式释放/处置。

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

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

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

于 2011-08-18T12:12:39.540 回答
11

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

用非托管术语 MSDN 说

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

.Close()在 .NET中,您应该调用Mutex- 这会释放... 因为每个进程在访问相同名称时HANDLE都有自己的这是一致的做法...一旦进程不再存在,不调用不会留下任何问题(终结者和所有)...HANDLEMutexClose()

于 2011-08-18T12:36:45.667 回答
2

您需要处理等待句柄使用的资源。

从文档中:

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

等待句柄使用非托管资源,应在使用结束时处理。

MSDN 文档互斥体

于 2011-08-18T12:08:20.733 回答