为什么AutoResetEvent和ManualResetEvent不支持构造函数中的名称?

时间:2010-05-12 07:28:13

标签: multithreading .net-2.0 synchronization

在.NET Framework 2.0上,AutoResetEvent和ManualResetEvent继承自EventWaitHandle。 EventWaitHandle类有4个不同的构造函数。 3个构造函数支持为事件命名。另一方面,ManualResetEvent和AutoResetEvent都不支持命名并提供接收initialState的单个构造函数。我可以简单地从EventWaitHandle继承并编写我自己的那些支持所有构造函数重载的类的实现,但我不喜欢重新发明轮子,如果我不需要。我的问题是:

  • 命名事件是否存在特殊问题?
  • 你知道为什么微软不支持它吗?
  • 您是否有一个提案比继承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)  
        {  
        }  
    }  

1 个答案:

答案 0 :(得分:5)

你可以这样命名一个手动重置事件:

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

Here is the reference以上代码。我不知道设计背后的特殊原因,但msdn上的there are some notes表明存在基于应用程序域和过程的区别:

  

事件等待句柄在许多方面很有用   相同的同步方案   作为Monitor类。事件等待   手柄通常比使用更容易   System.Threading.Monitor.Wait和   System.Threading.Monitor.Pulse(System.Object的)   方法,他们提供更多的控制   过度信号。命名事件等待   句柄也可以用来   同步跨越的活动   应用领域和流程,   而监视器是本地的   应用领域。