如何配置ManualResetEvent

时间:2011-03-11 08:39:26

标签: c# multithreading .net-4.0 dispose idisposable

您好 当我使用以下代码时:

 myManualResetEvent.Dispose();

编译器给出了这个错误:

 'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.
以下行如何正常工作:

 ((IDisposable)myManualResetEvent).Dispose();

是处理的正确方法,还是在运行时它可能会在某些场景中崩溃。

感谢。

3 个答案:

答案 0 :(得分:16)

.NET基类库的设计者决定使用explicit interface implementation实现Dispose方法:

private void IDisposable.Dispose() { ... }

Dispose方法是私有的,调用它的唯一方法是将对象强制转换为IDisposable

这样做的原因是将Dispose方法的名称自定义为更好地描述对象如何处置的内容。对于ManualResetEvent,自定义方法是Close方法。

要处置ManualResetEvent,您有两个不错的选择。使用IDisposable

using (var myManualResetEvent = new ManualResetEvent(false)) {
  ...
  // IDisposable.Dispose() will be called when exiting the block.
}

或致电Close

var myManualResetEvent = new ManualResetEvent(false);
...
// This will dispose the object.
myManualResetEvent.Close();

您可以在MSDN上的设计指南实施最终化和处理以清理非托管资源Customizing a Dispose Method Name部分中阅读更多内容:

  

有时,特定于域的名称比Dispose更合适。例如,文件封装可能希望使用方法名称Close。在这种情况下,请私下实施Dispose并创建一个调用Close的公开Dispose方法。

答案 1 :(得分:3)

WaitHandle.Close

  

此方法是公共版本   IDisposable.Dispose方法   实现以支持IDisposable   接口

答案 2 :(得分:2)

根据the documentationWaitHandle.Dispose()WaitHandle.Close()是等效的。存在Dispose以允许通过IDisposable接口关闭。要手动关闭WaitHandle(例如ManualResetEvent),您只需直接使用Close而不是Dispose

  

<强> WaitHandle.Close

     

[...]   此方法是为支持IDisposable接口而实现的IDisposable.Dispose方法的公共版本。