您好,当我使用以下代码时:
myManualResetEvent.Dispose();
编译器报错如下:
'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.
然而以下代码行可以正常工作:
((IDisposable)myManualResetEvent).Dispose();
这是正确的处理方式,但在某些情况下可能会导致运行时崩溃。
谢谢。
您好,当我使用以下代码时:
myManualResetEvent.Dispose();
'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.
然而以下代码行可以正常工作:
((IDisposable)myManualResetEvent).Dispose();
这是正确的处理方式,但在某些情况下可能会导致运行时崩溃。
谢谢。
.NET基类库的设计者决定使用显式接口实现来实现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的设计指南《实现Finalize和Dispose以清理非托管资源》中的自定义Dispose方法名称一节中了解更多信息:
有时候,使用特定领域的名称比
Dispose
更为合适。例如,文件封装可能需要使用方法名Close
。在这种情况下,私下实现Dispose
并创建一个公共的Close
方法来调用Dispose
。
WaitHandle.Dispose()
和WaitHandle.Close()
是等效的。 Dispose
存在是为了通过IDisposable
接口关闭。对于手动关闭WaitHandle(例如ManualResetEvent),您可以直接使用Close
而不是Dispose
:
[...] 此方法是IDisposable.Dispose方法的公共版本,用于支持IDisposable接口。