代码之家  ›  专栏  ›  技术社区  ›  Ikaso

为什么AutoResetEvent和ManualResetEvent在构造函数中不支持name?

  •  2
  • Ikaso  · 技术社区  · 16 年前

    在.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 回复  |  直到 16 年前
        1
  •  5
  •   Kiril    16 年前

    您可以创建一个命名的手动重置事件,如下所示:

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

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

    事件等待句柄在许多情况下都很有用 相同的同步场景 作为班长。事件等待 把手通常比把手更容易使用 System.Threading.Monitor.Wait和 System.Threading.Monitor.Pulse(系统对象) 方法,它们提供了更多的控制 过信号。命名事件等待 跨服务器同步活动 而监视器是本地的