我在关注本教程:http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx来创建一个Windows服务。我有一个名为TaskManager
的课程,它使用Quartz.Net来管理一堆作业。它有.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)部分中包含代码,那么是否正确执行以下操作(基本上用于上述第一个代码块中的两种方法):
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);
}
如果这是正确的,那么是serviceStatus.dwWaitHint = 100000;
性质的东西,我需要做出明智的选择或者是默认值,坚持一件好事吗?基本上我不知道这个值是...
嗯,不知道它是如何进入该MSDN文章。在99.9%的案例中,ServiceBase类已经处理好服务状态的方式已经足够。包含此dwWaitHint,它由ServiceBase.RequestAdditionalTime()方法包装。你不应该需要它,30秒就足以让99.9%的所有服务开始:)请注意,4.5之前的这篇文章的版本都没有谈及它。 – 2014-10-07 20:11:37
@HansPassant所以你是说如果我只是使用我的第一块代码,不要惹恼serviceStatus - 它通常很好?你什么意思30秒...是默认还是你建议我使用30000而不是100000? – Dan 2014-10-07 21:29:07
不要惹它。 30秒是Windows使用的默认超时。 – 2014-10-07 21:32:10