首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理ManualResetEvent

如何处理ManualResetEvent
EN

Stack Overflow用户
提问于 2011-03-11 16:39:26
回答 3查看 6.8K关注 0票数 6

嗨,当我使用以下代码时:

代码语言:javascript
复制
 myManualResetEvent.Dispose();

编译器给出了这个错误:

代码语言:javascript
复制
 'System.Threading.WaitHandle.Dispose(bool)' is inaccessible due to its protection level.

然而,下面这行代码运行良好:

代码语言:javascript
复制
 ((IDisposable)myManualResetEvent).Dispose();

这是正确的处置方式吗?或者在运行时,它可能会在某些场景中崩溃。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-11 17:06:13

.NET基类库的设计者决定使用explicit interface implementation实现Dispose方法

代码语言:javascript
复制
private void IDisposable.Dispose() { ... }

正如您已经发现的那样,Dispose方法是私有的,调用它的唯一方法是将对象强制转换为IDisposable

这样做的原因是为了将Dispose方法的名称定制为更好地描述对象的释放方式。对于ManualResetEvent,自定义方法是Close方法。

要处理ManualResetEvent,您有两个很好的选择。使用IDisposable

代码语言:javascript
复制
using (var myManualResetEvent = new ManualResetEvent(false)) {
  ...
  // IDisposable.Dispose() will be called when exiting the block.
}

或者调用Close

代码语言:javascript
复制
var myManualResetEvent = new ManualResetEvent(false);
...
// This will dispose the object.
myManualResetEvent.Close();

你可以在Customizing a Dispose Method Name的设计指南中阅读更多关于实现Finalize和Dispose来清理非托管资源的内容:

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

的公共Close方法

票数 16
EN

Stack Overflow用户

发布于 2011-03-11 16:41:23

WaitHandle.Close

此方法是为支持IDisposable接口而实现的IDisposable.Dispose方法的公共版本。

票数 3
EN

Stack Overflow用户

发布于 2011-03-11 16:43:38

根据the documentation的说法,WaitHandle.Dispose()WaitHandle.Close()是等效的。存在允许通过IDisposable接口关闭的Dispose。对于手动关闭WaitHandle (如ManualResetEvent),您可以直接使用Close而不是Dispose

..。此方法是为支持IDisposable接口而实现的IDisposable.Dispose方法的公共版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5270701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档