如何配置ManualResetEvent

Azo*_*ous 6 c# multithreading dispose idisposable .net-4.0

嗨当我使用以下代码时:

 myManualResetEvent.Dispose();
Run Code Online (Sandbox Code Playgroud)

编译器给出了这个错误:

 'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.
Run Code Online (Sandbox Code Playgroud)

然后以下行正常工作:

 ((IDisposable)myManualResetEvent).Dispose();
Run Code Online (Sandbox Code Playgroud)

它是正确的处理方式,或者在运行时它可能会在某些场景中崩溃.

谢谢.

Mar*_*age 16

.NET基类库的设计者决定Dispose使用显式接口实现来实现该方法:

private void IDisposable.Dispose() { ... }
Run Code Online (Sandbox Code Playgroud)

Dispose方法是私有的,调用它的唯一方法是将对象转换IDisposable为您发现的对象.

这样做的原因是将Dispose方法的名称自定义为更好地描述对象如何处置的东西.对于ManualResetEvent定制方法是Close方法.

处置ManualResetEvent你有两个很好的选择.使用IDisposable:

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

或致电Close:

var myManualResetEvent = new ManualResetEvent(false);
...
// This will dispose the object.
myManualResetEvent.Close();
Run Code Online (Sandbox Code Playgroud)

您可以在设计指南中的定制Dispose方法名称一节中阅读更多内容.在MSDN 上实现Finalize和Dispose以清理非托管资源:

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