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.