簡體   English   中英

我需要 Dispose() 或 Close() 一個 EventWaitHandle 嗎?

[英]Do I need to Dispose() or Close() an EventWaitHandle?

如果我使用EventWaitHandle (或AutoResetEventManualResetEvent )在線程之間進行同步,那么當我完成它時是否需要在該事件句柄上調用Close()Dispose()方法?

EventWaitHandle繼承自WaitHandle ,后者實現了IDisposable 如果我沒有在任何包含 EventWaitHandle 的EventWaitHandle上實現IDisposable ,FxCop 會抱怨。 所以這表明我確實需要調用它。

但是,這些 MSDN 使用示例都沒有調用Dispose()Close()

http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent( VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(VS.80).aspx

這只是微軟無視自己建議的一個例子嗎?

EventWaitHandle的一次性資源實際上是一個SafeHandle (包裝在SafeWaitHandle中)。 SafeHandle實現了一個終結器,它最終確保釋放必要的資源,因此在這種情況下讓垃圾收集器/終結器線程處理它應該是安全的。

但是,當不再需要資源時,顯式調用Dispose()始終是一個好主意。

C# 3.0 中的線程章節概括地

這種做法(可以說)對於等待句柄是可以接受的,因為它們的操作系統負擔很輕(異步委托完全依賴這種機制來釋放其IAsyncResult的等待句柄)。

您需要明確處置它們。 Close() 更適合他們,因為它確實調用了 Dispose()。

MSDN 中的 Class 定義:

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

所以是的,你必須因為 WaitHandle 是 IDisposable。 如果您不這樣做,FxCop 會認為這是違反規則的。

Close 方法在內部處理它。

MSDN 說

在釋放對 WaitHandle 的最后引用之前,請始終調用 Close 或 Dispose()。 否則,它正在使用的資源將不會被釋放。

因此,由於它們繼承了WaitHandle ,在我看來,您也應該處理EventWaitHandle (或AutoResetEventManualResetEvent

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM