Настройка зависимости между двумя службами Windows не обязательно достаточна, чтобы избежать условия гонки: то есть, чтобы клиентская служба не вызывала службу WCF до полной инициализации стека канала WCF сервера.
Зависимость службы просто гарантирует, что диспетчер управления службами Windows не запустит процесс обслуживания клиентов, пока серверная служба Windows не уведомит SCM о том, что он запущен. Достаточно ли этого, зависит от того, как вы пишете сервер.
Если служба сервера запускает новый поток для инициализации стека WCF, ваш метод OnStart
, вероятно, возвращается до того, как стек WCF будет готов для клиентов. Затем возникает условие состязания относительно того, будет ли первый вызов клиента успешным.
С другой стороны, если служба сервера не возвращается из OnStart (и, таким образом, не уведомляет SCM о том, что она запущена) до тех пор, пока стек канала не будет полностью открыт, зависимость удаляет условие гонки, но существует другая ловушка: вам нужно знать, что собственный тайм-аут SCM для запуска службы Windows не запускается при ожидании инициализации стека WCF, что вполне может произойти при перезагрузке, если, например, служба WCF зависит от сетевого стека. Если OnStart
сервера не возвращается в течение времени ожидания SCM, SCM вообще не будет пытаться запустить службу зависимого клиента, поскольку он не получает уведомление о запуске сервера. (В журнале событий Windows появится сообщение от SCM о том, что служба сервера не была запущена в течение ожидаемого времени.) Вы можете увеличить время ожидания SCM, вызвав ServiceBase.RequestAdditionalTime
во время инициализации службы WCF.
В любом случае, клиентская служба действительно должна быть написана так, чтобы она не потерпела неудачу полностью, если первый вызов WCF не будет успешным.
Вы на самом деле не говорите, какую привязку вы используете. Если клиентские и серверные службы всегда работают на одном компьютере, как вы, вероятно, указываете, тогда подумайте об использовании NetNamedPipeBinding: тогда ваша служба не будет зависеть от инициализации сетевых ресурсов, и запуск должен быть более быстрым.