我应该处理Mutex吗?
我正在开发2个Windows服务,它有一个公共数据库,我想用系统Mutex锁定(交叉处理)。
现在我想知道在try-finally
块中调用WaitOne()
和ReleaseMutex()
,或者我是否也应该using
Mutex(例如在using
块中)。 如果是这样我想我应该总是在WaitOne()
方法上捕获AbandonedMutexException
,或者我错在这里?
互斥锁是Windows内核对象(此处包含在.NET对象中)。
因此,它应该是一种非托管资源。
更准确地说,.NET对象包含互斥锁的HANDLE,必须以某种方式释放/丢弃互斥锁。
我不相信Mutex类docs中没有处理互斥对象的代码示例 。 尽管Henzi在评论中有一个很好的观点:Mutex对象是静态的,并且在进程退出时由终结器处理或由Windows内核销毁。
另请注意, Close()也会处理该对象。
当然,即使您不使用它,在应用程序中保留现有Mutex对象也没有错。 它们是轻资源。
根据这个,当持有该互斥锁的HANDLE
的最后一个进程结束时,一个命名的Mutex
被自动销毁。
MSDN表示,在非托管条款中
使用
CloseHandle
函数关闭句柄。 当进程终止时,系统会自动关闭句柄。 当最后一个句柄关闭时,互斥对象将被销毁。
在.NET中,您应该在Mutex
上调用.Close()
– 这会释放HANDLE
…因为每个进程在访问同一个名为Mutex
时都会获得自己的HANDLE
这是一致的做法…不会调用Close()
一旦这个过程不复存在,就会留下任何问题(终结者和所有人)……
您需要处理waithandle使用的资源。
从文档:
释放WaitHandle类的当前实例使用的所有资源。 (inheritance自WaitHandle。)
waithandle使用非托管资源,应在使用结束时进行处理。
MSDN文档Mutex
上述就是C#学习教程:我应该处理Mutex吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1020581.html