我一直在阅读.NET线程,并且正在使用ManualResetEvent编写一些代码。我在互联网上发现了很多代码示例。但是,在阅读WaitHandle的文档时,我看到了以下内容:
这些示例似乎都没有调用它们创建的ManualResetEvent对象上的.Close(),甚至没有调用pfxteam博客中的Recursion and Concurrency文章(编辑-我错过了一个using块)。这仅仅是示例性的监督,还是不需要?我很好奇,因为WaitHandle“封装了特定于操作系统的对象”,因此很容易出现资源泄漏。
最佳答案
通常,如果某个对象实现了IDisposable
,那么这样做是有原因的,您应该调用Dispose
(或Close
(视情况而定))。在您所访问的示例中,ManualResetEvent包装在using
语句中,该语句将“自动”处理调用Dispose
的处理。在这种情况下,Close
与Dispose
是同义词(在提供IDisposable
方法的大多数Close
实现中都是如此)。
该示例中的代码:
using (var mre = new ManualResetEvent(false))
{
...
}
扩展到
var mre = new ManualResetEvent(false);
try
{
...
}
finally
{
((IDispoable)mre).Dispose();
}