【问题标题】:How to Dispose ManualResetEvent如何处理 ManualResetEvent
【发布时间】:2011-03-11 08:39:26
【问题描述】:

嗨 当我使用以下代码时:

 myManualResetEvent.Dispose();

编译器给出这个错误:

 'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.

howevr 以下行工作正常:

 ((IDisposable)myManualResetEvent).Dispose();

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

谢谢。

【问题讨论】:

  • 我认为您的示例代码可能有问题。如果编译器给出“'System.Threading.WaitHandle.Dispose(bool)' 由于其保护级别而无法访问。”错误您必须使用 myManualResetEvent.Dispose(true);或 myManualResetEvent.Dispose(false);不是 myManualResetEvent.Dispose();

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


【解决方案1】:

.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 上的设计指南 Implementing Finalize and Dispose to Clean Up Unmanaged Resources 中的 Customizing a Dispose Method Name 部分阅读更多内容:

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

【讨论】:

    【解决方案2】:

    WaitHandle.Close

    此方法是公开版 IDisposable.Dispose 方法 实施以支持 IDisposable 界面。

    【讨论】:

      【解决方案3】:

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

      WaitHandle.Close

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        相关资源
        最近更新 更多