Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否需要处置()或关闭()EventWaitHandle?_C#_.net_Multithreading_Synchronization - Fatal编程技术网

C# 是否需要处置()或关闭()EventWaitHandle?

C# 是否需要处置()或关闭()EventWaitHandle?,c#,.net,multithreading,synchronization,C#,.net,Multithreading,Synchronization,如果我正在使用EventWaitHandle(或AutoResetEvent,ManualResetEvent)在线程之间进行同步,那么我是否需要在完成该事件句柄时调用该事件句柄上的Close()或Dispose()方法 EventWaitHandle继承自WaitHandle,它实现了IDisposable。如果我没有在任何包含EventWaitHandle的类上实现IDisposable,FxCop就会抱怨。因此,这表明我确实需要称之为 但是,这些MSDN使用示例都没有调用Dispose()

如果我正在使用
EventWaitHandle
(或
AutoResetEvent
ManualResetEvent
)在线程之间进行同步,那么我是否需要在完成该事件句柄时调用该事件句柄上的
Close()
Dispose()
方法

EventWaitHandle
继承自
WaitHandle
,它实现了
IDisposable
。如果我没有在任何包含
EventWaitHandle
的类上实现
IDisposable
,FxCop就会抱怨。因此,这表明我确实需要称之为

但是,这些MSDN使用示例都没有调用
Dispose()
Close()


这只是微软忽视他们自己建议的一个例子吗?

您需要明确地处理它们。Close()更适合他们,因为它调用Dispose()。

MSDN中的类定义:

public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable

所以是的,你必须这样做,因为WaitHandle是可识别的。如果您不这样做,FxCop会发现这违反了规则。

事件WaitHandle的可处置资源实际上是一个
安全句柄(包装在
安全WaitHandle
中)
SafeHandle
实现一个终结器,它最终确保释放必要的资源,因此在这种情况下让垃圾收集器/终结器线程处理它应该是安全的

但是,当不再需要资源时,显式调用
Dispose()
总是一个好主意

美国的线程章节

这种做法(可以说)是可以接受的 具有等待句柄,因为它们具有 操作系统负担轻(异步 代表们完全依赖于这种机制 要释放其
IAsyncResult
的等待 手柄)


Close方法在内部处理它。

谢谢Peter,但是为什么MSDN使用示例不调用Close()或Dispose()?这仅仅是微软没有听从他们自己的建议吗?我猜有50%的人没有听从他们自己的建议,50%的人试图让例子尽可能简短。。由于编写示例的人(不是核心sdk开发人员)不太了解情况。@PeterDrier示例使用静态等待句柄。我认为让GC收集它是不可取的。将工作留给终结器线程只是一种糟糕的做法。只有一个终结器线程,让它做超出其实际应该做的事情是不好的。如果线程被阻止,则应用程序将挂起。如果在终结器线程上引发异常,则AppDomain将崩溃。具有适当的dispose模式可以保证调用GC.SuppressFinalize(),从而抑制此对象的终结。我有一个实现IDisposable的示例-我同意,这就是为什么我声明您应该显式调用
Dispose
。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论-