2012-08-15 3 views
3

응용 프로그램 내에서 서비스를 제어하려고합니다. StartService (MSDN)를 통해 서비스를 시작하면 서비스가 시작될 때까지 약 10 초가 필요하지만 StartService를 호출하면 컨트롤이 즉시 주 응용 프로그램에 다시 제공됩니다.Windows 서비스를 비동기 적으로 중지 중

그러나 ControlService (MSDN) - AFAIK를 통해 서비스를 중지 할 때 StopService가 없습니다. 서비스가 중지 될 때까지 약 10 초 동안 주 응용 프로그램을 차단합니다.

Start: StartServiceW(handle, 0, NULL) 
Stop: ControlService(handle, SERVICE_CONTROL_STOP, status) 

Windows 서비스를 비 차단/비동기 적으로 중지 할 수있는 방법이 있습니까?

+2

스레드에서 호출 해 보았습니까? 블로킹 호출을 비 블로킹으로 바꾸는 고전적인 접근법 ... –

+0

어떻게 작동하는지 알 수는 없지만'sc' 명령어를 사용하면 서비스가 차단되지 않고 서비스를 중지 할 수 있습니다. 흥미로운 API 함수가 있는지 살펴보십시오. – wilx

+0

이런 식으로 행동하는 특정 서비스가 하나 있습니까? 내 생각 엔 문제의 서비스가 STOP 요청에 제대로 응답하지 않는 것입니다. –

답변

1

나는 아마도 새로운 스레드에서 서비스를 중지 할 것입니다. 그러면 주 스레드가 차단되지 않습니다.

1

SCM은 제어 요청을 직렬화 된 방식으로 처리합니다. 서비스가 제어 요청을 처리하는 중일 경우 ControlService()은 SCM이 새 요청을 처리 할 수있을 때까지 차단됩니다. 이 the documentation에서 많이 언급된다

는 SCM은에서 서비스 제어 알림을 처리하는 일련 패션이 다음 하나를 보내기 전에 서비스 제어를 통지 처리를 완료 할 때 하나 개의 서비스 기다립니다. 따라서 어떤 서비스가 사용 중이면 ControlService에 대한 호출이 30 초 동안 차단되고 제어 코드를 처리합니다. 시간 초과가 만료 된 경우에도 통화 중 서비스가 처리기 기능에서 을 반환하지 않은 경우 ControlService 이 ERROR_SERVICE_REQUEST_TIMEOUT으로 실패합니다.

+0

감사합니다. 이미 읽었습니다. 내 경우를 제외하고는 다른 제어 요청이 없으므로 여기에 해당되는 것으로 생각하지 않습니까? – OnTheFly

+0

"** ANY ** 서비스가 제어 코드를 처리하는 중일 경우 ControlService에 대한 호출이 30 초 동안 차단됩니다." –

1

서비스가 제어 핸들러 루틴에서 정리 중입니다. 종료하는 데 몇 초의 시간이 걸리는 서비스는 정상이지만 10 초가 걸릴 서비스는 확실히 STOP_PENDING 상태를 설정 한 다음 비동기식으로 정리해야합니다.

이 서비스가 자체 서비스 인 경우 해당 문제를 해결해야합니다. 나는 모든 정리가 정말로 필요하다는 것을 확인함으로써 시작할 것입니다; 예를 들어 서비스가 다른 서비스와 프로세스를 공유하지 않는 한 중지하기 전에 메모리를 비울 필요가 없습니다. 클린업을 실제로 충분히 빨리 수행 할 수없는 경우, 서비스 종료를 수행하고 서비스 상태를 STOP_PENDING으로 설정하기 위해 개별 스레드 (또는 기본 스레드에 신호)를 실행하십시오.

다른 사람의 서비스 인 경우 유일한 해결책은 별도의 스레드 또는 하위 프로세스에서 중지 요청을 발행하는 것입니다.

+0

감사합니다.이미 SERVICE_STOP_PENDING을 (를) 설정 중이지만 ControlService는 SERVICE_STOPPED까지 차단 중입니다. 너무 좋지 않음 ... – OnTheFly

+0

상태를 SERVICE_STOP_PENDING으로 설정 한 후 서비스 제어 루틴이 종료 되었습니까? 코드를 보여줄 수 있습니까? –

관련 문제