C# 是否需要处置()或关闭()EventWaitHandle?
如果我正在使用C# 是否需要处置()或关闭()EventWaitHandle?,c#,.net,multithreading,synchronization,C#,.net,Multithreading,Synchronization,如果我正在使用EventWaitHandle(或AutoResetEvent,ManualResetEvent)在线程之间进行同步,那么我是否需要在完成该事件句柄时调用该事件句柄上的Close()或Dispose()方法 EventWaitHandle继承自WaitHandle,它实现了IDisposable。如果我没有在任何包含EventWaitHandle的类上实现IDisposable,FxCop就会抱怨。因此,这表明我确实需要称之为 但是,这些MSDN使用示例都没有调用Dispose()
EventWaitHandle
(或AutoResetEvent
,ManualResetEvent
)在线程之间进行同步,那么我是否需要在完成该事件句柄时调用该事件句柄上的Close()
或Dispose()
方法
EventWaitHandle
继承自WaitHandle
,它实现了IDisposable
。如果我没有在任何包含EventWaitHandle
的类上实现IDisposable
,FxCop就会抱怨。因此,这表明我确实需要称之为
但是,这些MSDN使用示例都没有调用Dispose()
或Close()
:
这只是微软忽视他们自己建议的一个例子吗?您需要明确地处理它们。Close()更适合他们,因为它调用Dispose()。MSDN中的类定义:
public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable
所以是的,你必须这样做,因为WaitHandle是可识别的。如果您不这样做,FxCop会发现这违反了规则。事件WaitHandle的可处置资源实际上是一个
安全句柄(包装在安全WaitHandle
中)SafeHandle
实现一个终结器,它最终确保释放必要的资源,因此在这种情况下让垃圾收集器/终结器线程处理它应该是安全的
但是,当不再需要资源时,显式调用Dispose()
总是一个好主意
美国的线程章节
这种做法(可以说)是可以接受的
具有等待句柄,因为它们具有
操作系统负担轻(异步
代表们完全依赖于这种机制
要释放其IAsyncResult
的等待
手柄)
Close方法在内部处理它。谢谢Peter,但是为什么MSDN使用示例不调用Close()或Dispose()?这仅仅是微软没有听从他们自己的建议吗?我猜有50%的人没有听从他们自己的建议,50%的人试图让例子尽可能简短。。由于编写示例的人(不是核心sdk开发人员)不太了解情况。@PeterDrier示例使用静态等待句柄。我认为让GC收集它是不可取的。将工作留给终结器线程只是一种糟糕的做法。只有一个终结器线程,让它做超出其实际应该做的事情是不好的。如果线程被阻止,则应用程序将挂起。如果在终结器线程上引发异常,则AppDomain将崩溃。具有适当的dispose模式可以保证调用GC.SuppressFinalize(),从而抑制此对象的终结。我有一个实现IDisposable的示例-我同意,这就是为什么我声明您应该显式调用Dispose
。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论-