Обернуть объект AutoResetEvent в ограниченный WaitHandle? - PullRequest
0 голосов
/ 11 июня 2011

Я создал библиотеку, которая запускает поток, чтобы выполнить свою задачу, и возвращает вызывающему объект WaitHandle.

Глядя на отчет об ошибке, я подозреваю, что код, вызывающий мою библиотеку, берет возвращаемый объект и приводит его к AutoResetEvent (который он есть) и поднимает сам флаг. Это не предназначено для этого.

Есть ли способ, которым я могу обернуть объект AutoResetEvent объектом, который все еще может быть WaitOne'd и WaitAny'd, но может быть вызван только моим кодом?

Спасибо.

1 Ответ

0 голосов
/ 11 июня 2011

Вы можете создать новый класс, производный от 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.

. Я по-прежнему считаю, что лучший способ действий - это сказать клиенту, чтобы он этого не делал,Но если вы должны предотвратить это, вышесказанное должно сработать.

...