我应该处理Mutex吗?

时间:2011-08-18 12:01:08

标签: c# mutex dispose cross-process

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

现在我想知道是否可以在WaitOne()块中调用ReleaseMutex()try-finally,或者我是否也应该放置互斥锁(例如在using块中)。如果是这样,我想我应该总是抓住AbandonedMutexException方法上的WaitOne()或者我错了吗?

3 个答案:

答案 0 :(得分:14)

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

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

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

我不相信没有处置互斥对象的code sample in the Mutex class docs。虽然Henzi在评论中有一个很好的观点:Mutex对象是静态的,并且在进程退出时由终结器处理或由Windows内核销毁。

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

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

答案 1 :(得分:9)

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

在非托管条款中,MSDN说

  

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

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

答案 2 :(得分:2)

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

来自文档:

  

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

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

MSDN Documentation Mutex