.NET互斥是否会使用非托管资源?

时间:2013-03-01 09:26:30

标签: c# multithreading synchronization mutex dispose

MSDN文章Mutex Class告诉(在对代码示例的评论中):

  

与Monitor不同,Mutex可以与WaitHandle.WaitAll一起使用   WaitAny,可以通过AppDomain边界传递

这是否意味着互斥量会使用非托管的resurces? 那么,为什么Mutex使用的MSDN代码示例不使用Dispose()?

2 个答案:

答案 0 :(得分:2)

Mutex和许多其他同步对象是围绕不同内核对象(http://msdn.microsoft.com/en-us/library/windows/desktop/ms724485(v=vs.85).aspx)的包装器,所以是的,它们使用了非托管资源。

当你完成它们时你应该调用.Dispose,但是,当你的进程退出或者启动时终结器(如果你没有处理它们)时它们将被释放,所以我想,为了简单起见他们只是没有Dispose他们正确的例子。

MSDN关于WaitHandles的注意事项:

Always call Dispose before you release your last reference to the WaitHandle. 
Otherwise, the resources it is using will not be 
freed until the garbage collector calls the WaitHandle object's Finalize method.

答案 1 :(得分:0)

是的,您应该释放Mutex,因为它继承了实现WaitHandle的{​​{1}}。

在内部,IDisposableCreateMutext创建的内核对象的包装器。我想.Net Mutex类的Dispose实现调用Mutex来关闭内核对象句柄。

在任何情况下,当进程退出时,系统会自动关闭这样的句柄。