2011-09-16 3 views
7

우리는 A부터 B까지 매우 중요한 데이터를 트랜잭션 방식으로 보여주는 .NET Windows 서비스를 제공합니다. 또한 서비스에서 사용되는 모든 외부 구성 요소가 올바르게 할당되지 않았고 서비스 자체를 종료하기 전에 모든 구성 요소가 정리되었는지 확인해야합니다. 시간이 걸릴 수 있습니다! 그 이유는 서비스가 2, 3 또는 4 시간 후에 도착하는 외부 구성 요소의 콜백을 기다려야하기 때문입니다. Windows 서비스를 정상적으로 종료하는 데 몇 시간이 걸릴 수 있습니까?

  1. 는 Windows가 정상적으로 종료에 서비스를 위해 너무 오래 기다릴 수 있습니까?
  2. 서비스에 운영 체제에 의해 서비스가 종료 될 때 어떤 일이 일어날 지 지시 할 수있는 옵션이 있습니다 (예 : ). 모두 종료를 방지 하시겠습니까?
  3. 다른 시나리오에서 서버가 재부팅해야하는 경우 어떻게됩니까? 서비스를 받기까지 몇 시간을 기다릴 수 있습니까?
  4. 서비스가 종료되기까지 OS가 서비스를 대기하는 시간에는 제한이 있습니까?
+6

당신은 잊었 사용할 수 없습니다 , 단지 플러그를 뽑기 전에? –

답변

7

CanStop, CanShutdown, CanHandlePowerEvent을 사용하면 컴퓨터가 종료되고 적절하게 반응 할 때 알림을받을 수 있습니다.

protected override void OnShutdown() 
{ 
    base.RequestAdditionalTime(MaxTimeout); 
    serviceCore.OnShutdown(); 
    Stop(); 
} 

경우 OnShutdown() 이상 20 초 동안 블록 (레지스트리 HKEY_LOCAL_MACHINE을 \ 시스템에 저장된 기본값 \ CURRENTCONTROLSET \

는 스레드를 종료하기 위해 추가 시간을 요청하기 위해 ServiceBase.RequestAdditionalTime 방법을 사용 Control \ WaitToKillServiceTimeout), 서비스가 응답하지 않고 죽게됩니다. 그 기계가 제대로 종료하는 사람이 대기하는 시간에 제한이 5 :

There is a good blog post from the BCL team on that subject that I recommend.

+2

'OnShutdown'에서'RequestAdditionalTime'을 호출하면'InvalidOperationException'이 발생합니다. –

4

예 서비스가 완료 될 때까지 서비스가 중단 될 수 있지만 그래야합니까? 레지스트리에 시간 초과 값이 있습니다. OS는 무엇입니까?

콜백을 다른 구성 요소와 분리하거나 데이터를 디스크에 버퍼하고 작은 조각으로 보내야한다고 생각합니다. 파워 컷은 어떻게됩니까? 아니면 누군가가 기다리고 지쳐서 스위치가 꺼지면?

데이터가 중요한 경우 메모리 외부에서 관리하고 프로세스를 다시 시작할 수있게 만드십시오. 이렇게하면 길어진 종료 프로세스가 완료됩니다. 마찬가지로 진행을 위해 구성 요소를 폴링하는 방법은 차단 의존성을 제거합니다.

+0

예 데이터는 어떤 의미에서 중요합니다. 방대한 양의 데이터가 이동, 구문 분석 및 인덱싱되는 엔터프라이즈 수준의 응용 프로그램입니다. 문제는 구성 요소가 느리게 작동한다는 것입니다. 주어진 시간에 최대 20,000 콜백이 발생할 수 있으며, 그 이유 중 일부는 너무 오래 걸립니다. 폴링은 API가 허용하지 않는 옵션이 아닙니다. – John

+0

그건 엉망이야, 물론 각 통화는 몇 시간이 걸리지 않을까? 더 작은 배치를 사용하고 여러 컴퓨터에 호출을 분산시킬 수 있습니까? – TheCodeKing

0

당신은 RequestAdditionalTime OnShutdown() 내부 (MaxTimeout) ...