我需要在ManualResetEvent上调用Close()吗?我一直在阅读.NET线程,并且正在研究一些使用ManualResetEvent的代码。我在互联网上找到了很多代码示例。但是,在阅读WaitHandle的文档时,我看到以下内容:WaitHandle实现了Dispose模式。请参阅实施Finalize和Dispose以清理非托管资源。似乎没有一个示例在它们创建的ManualResetEvent对象上调用.Close(),甚至pfxteam博客中好的递归和并发文章也没有(编辑-这有一个我错过的用法块)。这只是一个示例疏忽,还是不需要?我很好奇,因为WaitHandle“封装了一个特定于操作系统的对象”,因此很容易发生资源泄漏。通常,如果一个对象实现了IDisposable,那么它出于某种原因会这样做,您应该调用Dispose(或Close,视情况而定)。在您的站点示例中,ManualResetEvent包装在一个using语句中,该语句将“自动”处理调用Dispose。在这种情况下,Close与Dispose同义(在大多数提供Close方法的IDisposable实现中就是这种情况)。示例中的代码:using(varmre=newManualResetEvent(false)){...}扩展为varmre=newManualResetEvent(false);最后尝试{...}{((IDispoable)mre).Dispose();我最近转发了JosephAlbahari、BenAlbahari撰写的C#4.0的Nutshell:TheDefinitiveReference的摘录。在第834页的第21章:线程中有一节对此进行了讨论。处理WaitHandle等待句柄结束后,可以调用它的Close方法释放操作系统资源。或者,您可以简单地删除对等待句柄的所有引用,并允许垃圾收集器稍后为您完成该工作(等待句柄实现处理模式,终结器调用Close)。这是(可以说)可以接受依赖此备份的少数场景之一,因为等待句柄具有轻微的操作系统负担(异步委托完全依赖此机制来释放其IAsyncResult的等待句柄)。等待句柄在应用程序域卸载时自动释放。Close在DisposeofManualResetEvent中处理,并由“using”语句调用。http://msdn.microsoft.com/en-us/library/yh598w02%28VS.100%29.aspx你会注意到代码使用(varmre=newManualResetEvent(false)){//异步处理左孩子ThreadPool.QueueUserWorkItem(delegate{Process(tree.Left,action);mre.Set();});//同步处理当前节点和右孩子action(tree.Data);过程(树。权利,行动);//等待左孩子mre.WaitOne();}使用'using'关键字。这将在完成时自动调用dispose方法,即使代码抛出异常也是如此。我经常使用ManualResetEvent并且认为我从未在单一方法中使用过它-它始终是类的实例字段。所以using()一般是不适用的。如果您的类实例字段是ManualResetEvent的实例,请让您的类实现IDisposable并在Dispose()方法中调用ManualResetEvent.Close()。然后在你的类的所有用法中,你需要使用using()或使包含类实现IDisposable并重复,然后重复......如果你将ManualResetEvent与匿名方法一起使用,它显然很有用。但正如Sam所说,它们通常可以传递给工人,然后设置并关闭。所以我想说这取决于你如何使用它的上下文-MSDNWaitHandle.WaitAll()代码示例有一个很好的例子来说明我的意思。下面是一个基于MSDN的示例,说明创建WaitHandles的using语句如何会出现异常:System.ObjectDisposedException"Safehandleisclosed"以上是C#学习教程:DoIneedtocallClose()onManualResetEvent?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——constintthreads=25;voidManualWaitHandle(){ManualResetEvent[]manualEvents=newManualResetEvent[threads];for(inti=0;i本文收集自网络,不代表立场,如涉及侵权,请点右联系管理员删除,转载请注明出处:
