嗨,当我使用以下代码时:
myManualResetEvent.Dispose();编译器给出了这个错误:
'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.然而,下面这行代码运行良好:
((IDisposable)myManualResetEvent).Dispose();这是正确的处置方式吗?或者在运行时,它可能会在某些场景中崩溃。
谢谢。
发布于 2011-03-11 17:06:13
.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();你可以在Customizing a Dispose Method Name的设计指南中阅读更多关于实现Finalize和Dispose来清理非托管资源的内容:
有时一个特定于域的名称比
Dispose更合适。例如,文件封装可能希望使用方法名称Close。在这种情况下,私有地实现Dispose并创建一个调用Dispose.
的公共Close方法
发布于 2011-03-11 16:41:23
WaitHandle.Close
此方法是为支持IDisposable接口而实现的IDisposable.Dispose方法的公共版本。
发布于 2011-03-11 16:43:38
根据the documentation的说法,WaitHandle.Dispose()和WaitHandle.Close()是等效的。存在允许通过IDisposable接口关闭的Dispose。对于手动关闭WaitHandle (如ManualResetEvent),您可以直接使用Close而不是Dispose
..。此方法是为支持IDisposable接口而实现的IDisposable.Dispose方法的公共版本。
https://stackoverflow.com/questions/5270701
复制相似问题