【发布时间】:2016-07-20 19:16:52
【问题描述】:
我正在关注本教程:http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx 来创建 Windows 服务。我有一个名为TaskManager 的类,它使用 Quartz.Net 来管理一堆工作。它有.Go()(不会阻塞)和.Stop() 方法。如果我理解正确的话,在我的服务中我需要做的就是
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 之前的版本中根本没有讨论它。
-
@HansPassant 所以你是说如果我只使用我的第一个代码块并且根本不弄乱 serviceStatus - 它通常没问题吗?另外,您所说的 30 秒是什么意思...这是默认值还是您建议我使用 30000 而不是 100000?
-
别惹它。 30 秒是 Windows 使用的默认超时时间。
-
谢谢!请添加为答案
-
我还强烈建议查看 Topshelf 项目,该项目使整个 Windows 服务的故事变得更容易topshelf-project.com。 Quartz.NET 在 Quartz.Server 项目中也包含了一个这样的示例。
标签: c# windows-services quartz.net