我应该处理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
- 在查询上生成错误的列
- 是否可以伪造video流作为在Skype,Lync等中可见的虚拟摄像头?
- 在entity framework中加密ConnectionString(第一个代码)
- 从模型生成viewmodel?
- MVC5 Ninject绑定和HttpContext
- Xamarin表单Visual Studio 2015 HttpClient请求不在iOS上运行
- 尝试调试ASP.NET网站时Visual Studio 2013 sp1挂起?
- SubSonic生成的DB Schema,二进制类型?
- Active Directory PrincipalContext.ValidateCredentials域消除歧义