我一直在阅读.NET线程,并且正在使用ManualResetEvent编写一些代码。我在互联网上发现了很多代码示例。但是,在阅读WaitHandle的文档时,我看到了以下内容:



这些示例似乎都没有调用它们创建的ManualResetEvent对象上的.Close(),甚至没有调用pfxteam博客中的Recursion and Concurrency文章(编辑-我错过了一个using块)。这仅仅是示例性的监督,还是不需要?我很好奇,因为WaitHandle“封装了特定于操作系统的对象”,因此很容易出现资源泄漏。

最佳答案

通常,如果某个对象实现了IDisposable,那么这样做是有原因的,您应该调用Dispose(或Close(视情况而定))。在您所访问的示例中,ManualResetEvent包装在using语句中,该语句将“自动”处理调用Dispose的处理。在这种情况下,CloseDispose是同义词(在提供IDisposable方法的大多数Close实现中都是如此)。

该示例中的代码:

using (var mre = new ManualResetEvent(false))
{
   ...
}

扩展到
var mre = new ManualResetEvent(false);
try
{
   ...
}
finally
{
   ((IDispoable)mre).Dispose();
}

09-29 22:21