我应该处理Mutex吗?

Koe*_*oen 13 c# mutex dispose cross-process

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

现在我不知道是否它的确定只是调用WaitOne()ReleaseMutex()在一个try-finally块或者我应该也配置互斥(例如,在一个using块).如果是这样,我想我应该永远赶AbandonedMutexExceptionWaitOne()方法还是我错在这里?

Ser*_*ier 16

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

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

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

我不相信Mutex类docs中没有处理互斥对象的代码示例.虽然亨齐在评论一个好点:互斥对象是静态的,会被终结或者被安置或破坏由Windows内核在进程退出时.

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

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

  • 不 - 每个进程都有自己的HANDLE ...所以终结器只能摆脱那个HANDLE ......当没有更多HANDLE(在这个例子中=没有更多进程)到该Mutex时,内核对象本身最终被Windows销毁... (3认同)

Yah*_*hia 9

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

MSDN表示,在非托管条款中

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

在.NET你应该叫.Close()Mutex-这释放了HANDLE......因为每个进程都有自己的HANDLE访问甚至相同的命名时,Mutex这是一贯的做法......没有要求Close()不会离开behing一旦这个过程不再是任何问题(终结者和所有)...