English 中文(简体)
我需要Dispose()还是Close()一个EventWaitHandle?
原标题:
  • 时间:2009-03-18 19:49:18
  •  标签:

如果我使用EventWaitHandle(或AutoResetEventManualResetEvent)来在线程之间进行同步,那么当我完成后,需要调用Close()Dispose()方法关闭该事件句柄吗?

EventWaitHandle 继承自 WaitHandle,后者实现了 IDisposable。如果我没有在任何包含 EventWaitHandle 的类中实现 IDisposable,那么 FxCop 会抱怨。因此,这表明我确实需要调用它。

然而,这些MSDN用法示例均未调用Dispose()Close()

http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(VS.80).aspx

这只是微软无视自己建议的一个例子吗?

最佳回答

一个 EventWaitHandle 的一次性资源实际上是一个 SafeHandle(封装在 SafeWaitHandle 中)。SafeHandle 实现了一个终结器,最终确保必要的资源被释放,所以在这种情况下应该安全地让垃圾回收器/终结器线程处理它。

然而,当资源不再需要时,显式调用Dispose()总是一个好主意。

《C# 3.0 in a Nutshell》中的线程章节说明了

This practice is (arguably) acceptable with wait handles because they have a light OS burden (asynchronous delegates rely on exactly this mechanism to release their IAsyncResult s wait handle).

问题回答

你需要明确地处理它们。Close()对于它们来说更合适,因为它确实会调用Dispose()。

来自 MSDN 的类定义:

public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable

所以,是的,你必须要释放 WaitHandle 资源,因为其实现了 IDisposable 接口。如果你不这么做,FxCop 将发现这是一条规则违规。

关闭方法在内部处理它。

MSDN说:

在释放您对 WaitHandle 的最后引用之前,始终调用 Close 或 Dispose()。否则,它正在使用的资源将不会被释放。

所以,由于它们继承了WaitHandle,在我的意见中,您也应该处理EventWaitHandle(或AutoResetEventManualResetEvent





相关问题
热门标签