实施Windows服务-如何满足这些要求?

| 我正在寻找有关实施Windows服务的一些常规建议。我的要求如下: 该服务处理数据库中的行-因此,如果某行以某种状态存在,则它需要做一些工作,写入其他一些表,然后将该行标记为正在处理。 服务启动时可能有成千上万的行在等待处理-它应该处理所有这些。 然后,该服务应继续运行,在将所有行写入我的ForProcessing表时对其进行处理。 我需要能够正常关闭它-我不要任何已处理的行 它需要有效地执行-如果可能的话,我不想轮询数据库 所以我的具体问题是: 如何保持活动状态并对新行进行响应?我可以使用某种“ 0”对象有效地处理新行吗? 如何处理正常启动和关闭? 从数据库中提取行时,我应该获取所有等待处理的内容,还是一次获取一个? 假定已经是后台服务,那么我将同步处理行吗?换句话说,有没有必要在后台线程上处理行? 我需要考虑什么帐户以及在什么权限下运行?这是部署问题吗? 还有其他需要注意的问题吗? 感谢您的任何建议。 附言是否有其他合理的替代方法来使用Windows服务来实现这一目标?     
已邀请:
编写Windows服务并不是真的那么困难,但是乍一看似乎令人生畏。 至于清除业务逻辑,我通常会首先编写一个命令提示符程序,因为它很容易调试。 现在,继续进行服务。当然,可以使用Visual Studio创建Windows服务项目。   如何保持活动状态并对新行进行响应?我可以使用某种SQLDependency对象有效地处理新行吗? 好吧,我不确定是否可以,但是我可以告诉您您需要什么。您将需要一个线程。如果您未在OnStart事件中创建新线程,则服务将立即停止。可以使用.NET的许多线程机制之一直接创建此线程,也可以通过某种类型的计时器FileSystemWatcher(可能不适用于您)间接地创建此线程。   如何处理正常启动   关掉? 您可以在OnStop中执行此操作。您可以通过向线程发出信号(可能是通过全局变量)来表明该关闭了。然后,由线程决定是否及时注意到该信号,然后清理并退出线程。如果您所处的时间可能超过20秒,则需要告诉SCM(服务控制管理器)您需要更多时间。如果您不这样做,则停止该服务的用户会收到消息,指出该服务没有响应,最终将被杀死。   从数据库中提取行时,我应该获取所有等待处理的内容,还是一次获取一个? 那是一个商业决定。大概应该取决于每个过程需要花费多长时间,以便您可以在停止发生时及时采取措施。   假定已经是后台服务,那么我将同步处理行吗?换句话说,有没有必要在后台线程上处理行? 同样,这是一个业务决策,但是是的,我可能会保持同步。   我需要考虑什么帐户以及在什么权限下运行?这是部署问题吗? 好吧,这取决于。 SQL Server是否在同一盒子上?您正在使用Windows身份验证吗?如果SQL不在同一框中,则必须使用用户帐户或“ 1”。创建服务项目时,您将需要添加安装程序。创建项目后,您将获得一个组件类-在灰色屏幕上,右键单击并选择
Add Installer
。这将创建一个新的组件类,其中已经安装了两个模块。 serviceIntaller1具有服务名称,显示名称,描述以及启动类型(手动,自动等)之类的东西。另一个是serviceProcessInstaller1,您可以在其中确定要使用的登录帐户。   还有其他需要注意的问题吗? 嗯,大概吧。但是今天早上我还没有喝咖啡。 确实,最大的事情是计划如何使线程保持活动状态并响应最终的OnStop请求。例如,如果您要尝试使用
SqlDependency
类,则可能需要在OnStart中创建一个Manual或AutoResetEvent,启动线程并让线程设置
SqlDependency
,然后阻止reset事件。然后,在OnStop中释放您的重置事件,以便您的线程可以清理并离开。在那之后,那只是一个溜冰板! 玩得开心!     
我的第一个问题是,为什么触发器或SQL作业不够好?似乎任何一个都足够。运行脚本以赶上该过程,然后打开触发器。 如果您设置了服务,那么Jim首先会建议您作为控制台程序运行。或做类似这样的事情http://tech.einaregilsson.com/2007/08/15/run-windows-service-as-a-console-program/ 同样http://topshelf-project.com/看起来也是一个很好的起点。 您可能还想处理该服务的暂停和重新启动事件。就像吉姆所说,再次在另一个线程中产生您的处理。我只需要修复服务上的一个大问题,而我没有这样做,那么该服务只会处于启动状态,您将无法轻松终止它。 onStart方法必须返回。     

要回复问题请先登录注册