나는이 튜토리얼을 따라 Windows 서비스를 만들 수있다 : http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx. Quartz.Net을 사용하여 많은 작업을 관리하는 TaskManager
클래스가 있습니다. 그것에는 .Go()
(차단하지 않음)과 .Stop()
방법이 있습니다. 내가 올바르게 이해했다면, 내 봉사에서해야 할 일은 모두serviceStatus.dwWaitHint의 값을 선택하는 방법은 무엇입니까?
private TaskManager _taskManager;
public DataPumpService()
{
InitializeComponent();
_taskManager = new TaskManager();
}
protected override void OnStart(string[] args)
{
_taskManager.Go();
}
protected override void OnStop()
{
_taskManager.Stop();
}
입니다.하지만이 튜토리얼에는 서비스 상태를 설정하는 절이 있습니다. 실제로 서비스 상태가 무엇인지 또는 내가 설정하려고하는지는 설명하지 않습니다. TaskManager.Stop()
을 완료하는 데 몇 초가 걸릴 수 있습니다 (내부적으로 모든 작업에서 IScheduler.Interrupt()
을 호출 한 다음 IScheduler.Shutdown(true)
이라고 부름). 그럼 상태를 설정해야합니까? 그렇다면 설정 서비스 상태 섹션 the tutorial의 섹션 (1), (2) 및 (3)에 코드를 포함한다고 가정하면 위의 첫 번째 코드 블록에서 두 가지 방법 모두에 대해 다음을 수행하는 것이 올바른지 여부입니다. 이 옳다면, 나는 현명하게 선택해야하거나 기본값을 고수하는 좋은 일이다 serviceStatus.dwWaitHint = 100000;
속성 뭔가
protected override void OnStop()
{
// Update the service state to Stop Pending.
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING;
serviceStatus.dwWaitHint = 100000;
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
_taskManager.Stop();
// Update the service state to Running.
serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED;
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
}
입니까? 기본적으로 나는이 값이 @HansPassant으로
흠, 어떻게 MSDN 문서에 포함 시켰는지 확실하지 않습니다. ServiceBase 클래스가 이미 서비스 상태를 처리하는 방식은 99.9 %의 경우에 충분합니다. 이 dwWaitHint를 포함하여 ServiceBase.RequestAdditionalTime() 메소드로 래핑됩니다. 당신은 그것을 필요로하지 않아야한다. 30 초는 모든 서비스 시작의 99.9 %를 얻는 데 충분하다. :) 4.5 이전에이 기사의 어떤 버전도 그것에 대해 이야기하지 않는다. –
@HansPassant 그래서 첫 번째 코드 블록을 사용하고 serviceStatus를 전혀 사용하지 않으면 일반적으로 괜찮습니까? 또한 30 초까지는 무엇을 의미합니까? 기본 값입니까, 아니면 100000 대신 30000을 사용 하시겠습니까? – Dan
혼란스럽지 마라. Windows에서 사용하는 기본 시간 제한은 30 초입니다. –