加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 实现Windows服务 – 如何满足这些要求?

发布时间:2020-12-16 01:43:11 所属栏目:百科 来源:网络整理
导读:我正在寻找一些关于实现 Windows服务的一般建议.我的要求如下: 服务处理来自数据库的行 – 因此,如果存在具有特定状态的行,则需要执行一些工作,写入其他一些表,然后将该行标记为正在处理. 服务启动时可能有数千行等待处理 – 它应该全部处理它们. 然后服务
我正在寻找一些关于实现 Windows服务的一般建议.我的要求如下:

>服务处理来自数据库的行 – 因此,如果存在具有特定状态的行,则需要执行一些工作,写入其他一些表,然后将该行标记为正在处理.
>服务启动时可能有数千行等待处理 – 它应该全部处理它们.
>然后服务应继续运行,处理任何行,因为它们写入我的ForProcessing表.
>我需要能够优雅地关闭它 – 我不想要任何半处理过的行
>它需要高效执行 – 如果可能,我不想轮询数据库

所以我的具体问题是:

>如何保持活着并在写入新行时对其进行响应?我可以使用某种SQLDependency对象来有效地处理新行吗?
>我如何处理优雅的启动和关闭?
>从数据库中获取行时,我应该获取所有等待处理的行,还是一次只取一个?
>据推测,鉴于它已经是后台服务,我会同步处理行?换句话说,没有必要在后台线程上处理行?
>在帐户和运行权限方面我需要考虑什么?这是部署问题吗?
>还有其他问题或需要注意的事项吗?

谢谢你的建议.

PS.有没有其他合理的替代方法来使用Windows服务来实现这一目标?

解决方法

编写Windows服务并不是那么困难,但最初确实看起来令人生畏.

就清除业务逻辑而言,我通常会首先编写一个命令提示程序,因为调试起来要容易得多.

现在,关于服务.当然,使用Visual Studio创建Windows服务项目.

How do I keep it alive and responding to new rows as they’re written? Can I use a SQLDependency object of some kind to efficiently process new rows?

好吧,我不确定你是否可以,但我可以告诉你你需要什么.你需要一个线程.如果您未在OnStart事件中创建新线程,您的服务将立即停止.这个线程可以直接使用.NET的许多线程mechinisim创建,也可以通过某种类型的Timer,FileSystemWatcher(可能不适用于你)或其他类似的间接创建.

How do I handle graceful startup and
shut down?

您可以在OnStop中执行此操作.你可以通过信号通过一个全局变量发信号通知你是时候关闭了.然后,由您的线程及时通知信号并清理并退出线程.如果您处于可能需要20秒以上的事情中间,则需要告诉SCM(服务控制管理器)您需要更多时间.如果你不这样做,那么停止服务的用户就会收到消息说服务没有响应,最终会被杀死.

When picking up rows from the db,should I fetch all that are awaiting processing,or just one at a time?

这是一个商业决策.可能应该取决于每个处理过程需要多长时间,以便在发生停止时您可以及时.

Presumably,given that it is already a background service,I would process rows synchronously? In otherwords,there is no need to process rows on background threads?

同样,这是一个商业决策,但是,我可能会保持同步.

What do I need to think about in terms of accounts and under what permissions it runs? Is this a deployment issue?

嗯,一切都取决于. SQL Server是否在同一个盒子上?您使用的是Windows身份验证吗?如果SQL不在同一个框中,则必须使用用户帐户或网络服务.创建服务项目时,需要添加安装程序.创建项目后,您将获得一个Component Class – 在灰色屏幕上,右键单击并选择Add Installer.这将创建一个新的Component Class,其中已安装了两个模块. serviceIntaller1具有服务名称,显示名称和描述以及启动类型(手动,自动等).另一个是serviceProcessInstaller1,您可以在此决定使用哪个登录帐户.

Any other gotchas or things to be aware of?

呃,可能.但今天早上我还没喝咖啡.

实际上,最重要的是计划如何保持线程活跃并响应最终的OnStop请求.例如,如果您要尝试使用SqlDependency类,则可能需要在OnStart中创建Manual或AutoResetEvent,启动您的线程并让您的线程设置SqlDependency然后阻止重置事件.然后,在您的OnStop中释放您的重置事件,以便您的线程可以清理并离开.在那之后,它只是一个滑冰山!

玩得开心!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读