2010-05-12 82 views
2

在.NET Framework 2.0上,AutoResetEvent和ManualResetEvent從EventWaitHandle繼承。 EventWaitHandle類有4個不同的構造函數。 3個構造函數支持爲該事件命名。另一方面,ManualResetEvent和AutoResetEvent都不支持命名,並提供了接收initialState的單個構造函數。我可以簡單地繼承EventWaitHandle並編寫自己的支持所有構造函數重載的類的實現,但如果不需要,我不喜歡重新創建輪子。我的問題是:爲什麼AutoResetEvent和ManualResetEvent不支持構造函數中的名稱?

  • 命名事件是否存在特殊問題?
  • 你知道爲什麼微軟不支持它嗎?
  • 您是否有比從以下示例中的EventWaitHandle類繼承並調用適當的構造函數更好的建議?
 
    public class MyAutoResetEvent: EventWaitHandle 
    { 
     public MyAutoResetEvent(bool initialState) 
      : base(initialState, EventResetMode.AutoReset) 
     { 
     } 
     public MyAutoResetEvent(bool initialState, string name) 
      : base(initialState, EventResetMode.AutoReset, name) 
     { 
     } 
     public MyAutoResetEvent(bool initialState, string name, out bool createdNew) 
      : base(initialState, EventResetMode.AutoReset, name, out createdNew) 
     { 
     } 
     public MyAutoResetEvent(bool initialState, string name, out bool createdNew, EventWaitHandleSecurity eventSecurity) 
      : base(initialState, EventResetMode.AutoReset, string.Empty, out createdNew, eventSecurity) 
     { 
     } 
    } 

回答

5

您可以創建一個名爲手動重置事件就像這樣:

// Open the event by name. 
EventWaitHandle namedMRSE = 
    new EventWaitHandle(false, EventResetMode.ManualReset, @"TheName"); 

Here is the reference上面的代碼。我不知道背後設計了特別的原因,但there are some notes上暗示MSDN有基於應用領域和過程中的區別:

事件等待句柄在同一個同步的許多 是有用的作爲Monitor類的場景 。事件等待 句柄通常比 更容易使用System.Threading.Monitor.Wait和 System.Threading.Monitor.Pulse(System.Object) 方法,它們通過信號提供更多的控制 。命名事件等待 句柄也可以用於 跨 應用程序域和進程的同步活動, 而監視器對於 應用程序域是本地的。

+0

您的解決方案與我的解決方案類似。我從派生類構造函數中調用EventWaitHandle,並直接使用它。 – Ikaso 2010-05-12 09:57:35

+0

@lkaso我認爲這比創建一個派生類更直截了當......不幸的是,我沒有太多關於設計選擇的理由。 – Kiril 2010-05-12 15:50:48

相關問題