Класс 'Waiter' и контейнер в стиле списка должны это делать. Заблокируйте доступ к списку и установщик свойств / событие / что-либо с тем же критическим разделом. Классу-официанту нужны только AllowedValues и событие для ожидания вызывающих абонентов, (хорошо, возможно, вспомогательная проверка 'bool check (IEnumerable newAllowedValues)').
Так и должно быть. В WaitUntilPropertyIs () получите CS и сначала проверьте значения свойств, чтобы увидеть, может ли он просто освободить CS и немедленно вернуться, если нет, то вызывающая сторона должна ждать. Создайте официанта, скопируйте в переданные значения AllowedValues, добавьте официанта в список, отпустите CS и дождитесь события с прошедшим таймаутом. Когда ожидание события возвращается, повторно запишите CS, удалите официанта из списка, удалите его (), отпустите CS и вернитесь с true / false из вызова ожидания события.
В установщике / Action / что-нибудь, заполучите CS, итерируйте список, сравнивая с новыми AllowedValues, запускайте любое событие на любом официанте, где новые значения удовлетворяют диапазону, и затем освобождайте CS.
Rgds,
Martin