Вы можете создать новый класс, производный от EventWaitHandle
и переопределить Set
и Reset
, чтобы они ничего не делали или генерировали исключение.На самом деле вам придется создавать new
реализации, поскольку Set
и Reset
не являются виртуальными.Конечно, вам придется создавать свои собственные методы с другими именами.Как MyInternalSet
и MyInternalReset
.Возможно, но я бы не рекомендовал делать это.
Вместо этого я бы задокументировал, что клиент не должен устанавливать или сбрасывать событие, потому что это вызовет непредсказуемое поведение.
Вы можете создатьWaitHandle
-производный класс, который содержит ваш AutoResetEvent
как свойство internal
.Тогда клиентский код не сможет получить к нему доступ.Что-то вроде:
public class MyWaitHandle: WaitHandle
{
internal AutoResetEvent InternalEvent { get; private set; }
internal MyWaitHandle(AutoResetEvent event)
{
InternalEvent = event;
}
public override bool WaitOne(int32 timeout)
{
return InternalEvent.WaitOne();
}
}
Вам придется переопределить защищенный метод Dispose(Boolean)
, чтобы он располагал внутренним дескриптором, и вам понадобятся и другие WaitOne
перегрузки.Затем вы можете создавать internal
реализации Set
и Reset
или просто вызывать код с кодом InternalHandle.Set
.
. Я по-прежнему считаю, что лучший способ действий - это сказать клиенту, чтобы он этого не делал,Но если вы должны предотвратить это, вышесказанное должно сработать.