Почему AutoResetEvent и ManualResetEvent не поддерживают имя в конструкторе? - PullRequest
2 голосов
/ 12 мая 2010

В .NET Framework 2.0 AutoResetEvent и ManualResetEvent наследуются от EventWaitHandle. Класс EventWaitHandle имеет 4 разных конструктора. 3 из конструкторов поддерживают присвоение имени событию. С другой стороны, ManualResetEvent и AutoResetEvent не поддерживают именование и предоставляют один конструктор, который получает initialState. Я могу просто наследовать от EventWaitHandle и написать свою собственную реализацию тех классов, которые поддерживают все перегрузки конструктора, но я не люблю заново изобретать колесо, если мне это не нужно. Мои вопросы:

  • Есть ли особая проблема в именовании событий?
  • Есть ли у вас идеи, почему Microsoft не поддерживает его?
  • Есть ли у вас предложение лучше, чем наследование от класса 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 Ответ

5 голосов
/ 12 мая 2010

Вы можете сделать именованное событие ручного сброса следующим образом:

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

Вот ссылка для приведенного выше кода. Я не знаю конкретной причины дизайна, но есть некоторые заметки на msdn, которые предполагают, что есть различие, основанное на области приложения и процессе:

Ручки ожидания события полезны во многих из тех же сценариев синхронизации как класс монитора. Ожидание события ручки часто проще в использовании, чем System.Threading.Monitor.Wait и System.Threading.Monitor.Pulse (System.Object) методы, и они предлагают больше контроля по сигнализации. Ожидание именованного события ручки также могут быть использованы для синхронизировать действия через домены и процессы приложений, в то время как мониторы являются локальными для домен приложения.

...