![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Всем привет!
Суть проблемы такая: Есть сервис (Будем называть его сервис 1), который запускаясь (т.е в своей функции Start()) создаёт другой сервис (сервис ядра если быть точнее, будем называть его сервис 2) при помощи CreateService и т.д. Так вот, если сервис 1 запускать руками, то всё в порядке, сервис 2 стартует без замедления, но если выставить сервису 1 autorun и перезагрузить комп то происходит следующее: 1) Система загружается, как будто всё ok, но ни сервис 1 ни сервис 2 не запускаются, EventLog ничего не сообщает 2) примерно через минуту оба сервиса запускаются, и в Event Log'е появляется примерно следующее: * Service 1 hung during startup * запущен сервис какой-то там... * запущен сервис какой-то там... * Service 2 запущен * Service 1 запущен В чём может быть дело ? Может быть это не совсем корректно, запускать один сервис из под другого ? Если так, то почему при запуске руками всё нормально... -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 1 Всего: 12 |
На мой взгляд для таких задач правильнее использовать Service Dependencies.
Т.е. получается, что сервис будет зависим от второго сервиса (сервис ядра), соотв. сам автоматом его поднимет, сервис ядра выставить в мануальную загрузку, а первый сервис в автоматическую. п.с. единственная деталь, что при таком сценарии он сначала запустит сервис ядра, а потом уже первый сервис, но думаю суть идея должна быть ясна, дабы модифицировать, как надо. Это сообщение отредактировал(а) Baa - 16.11.2007, 17:00 -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Baa, идея ясна. Просто не хотелось бы инсталлировать два сервиса, хочу инсталлить один, а он в свою очередь пусть запускает кернеловский по желанию, не хочу чтобы запись о кернел сервисе постоянно висела в базе сервисов...
А вообще, я с этим всем немного поигрался и выяснил почему таки происходит подвисание, оказывается, ядерный сервис ждёт десктопа, т.е пока кто-нить не залогинится, а до того момента загрузится он не может, а т.к создаётся ядерный сервис в OnStart'е, то висит и главный сервис. Нужно каким-то образом дать понять ядерному сервису что он должен запуститься немедленно, а не ждать логина... -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Sheff, покажи код сервисов. Саму бизнес-логику не нужно, только инсталлеры, их запуск и запуск сервисов.
-------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
tol05, вобщем примерно так:
А вообще, я кажется разобрался, если вынести CreateService и всё что с ним связано в отдельный поток, то всё ok, сначала запускается сервис 1, затем сервис 2. Видимо менеджер сервисов винды синхронный, пока один сервис не запустится он других создавать не может, поэтому и было так: * Сервис 1 стартует, запускает сервис 2 * Сервис 2 ждёт пока сервис менеджер освободится * Сервис менеджер не освобождается, т.к сервис один не завершил запуск * Проходит минуты 2-3, сервис менеджер забивает на сервис 1, пишет в лог - halted * Загружает сервис 2 * И тут как раз сервис 1 оживает и заканчивает свой OnStart, тем самым, запускаясь Вот примерно такой сценарий я и наблюдал, но теперь всё впорядке, вроде бы. Это сообщение отредактировал(а) Sheff - 17.11.2007, 21:23 -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
да, он синхронный. 30 секунд на проход от точки входа до OnStart() и 30 секунд на отработку OnStart(). И все, всегда, рекомендуют по максимуму выносить логику во внешние потоки... С сервисами - самое главное - пораньше вернуть управление основному потоку. Молодец, что добил тему сам ![]() -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |