您好 当我使用以下代码时:
myManualResetEvent.Dispose();
编译器给出了这个错误:
'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.
以下行如何正常工作:
((IDisposable)myManualResetEvent).Dispose();
是处理的正确方法,还是在运行时它可能会在某些场景中崩溃。
感谢。
答案 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)
此方法是公共版本 IDisposable.Dispose方法 实现以支持IDisposable 接口
答案 2 :(得分:2)
根据the documentation,WaitHandle.Dispose()
和WaitHandle.Close()
是等效的。存在Dispose
以允许通过IDisposable
接口关闭。要手动关闭WaitHandle(例如ManualResetEvent),您只需直接使用Close
而不是Dispose
:
<强> WaitHandle.Close 强>
[...] 此方法是为支持IDisposable接口而实现的IDisposable.Dispose方法的公共版本。