将进程作为Windows服务运行时的最佳做法是什么?

abm*_*bmv 24 .net c# windows-services

在将流程或可执行文件作为服务运行时是否有任何事情需要处理.如静默日志记录.关键错误报告方案?等等?你怎么处理它?

adr*_*nks 21

对于严重错误报告,您将被限制使用标准服务设置(在已安装服务的属性中)或自己做某事.这可以是一个简单的日志文件,记录意外错误(通过使用AppDomain.UnhandledException来捕获和记录它们),使用Windows事件日志记录类似信息,或让另一个进程监视服务是否有错误(即服务停止)并提醒某人.

Microsoft有一篇题为" Windows服务应用程序简介 "的文章,它是在.Net中提供服务的一个很好的一般性介绍.

根据我的经验开发Windows服务的其他一些事项:

  • Windows服务允许启动约30秒.之后,Windows会将其报告为未正确启动.这意味着您需要确保您OnStart的服务方法启动新线程以运行服务然后返回.
  • 不要指望任何用户交互(即消息框,确认),因为服务运行"无头"(即没有UI),因此您不能指望用户与其进行交互.
  • 检查将运行该服务的帐户,以确保您没有以具有不必要的高安全性权限的用户身份运行它.
  • 广泛使用日志记录(例如log4net),以便您可以在运行时查看服务正在执行的操作,以及能够诊断任何错误(通过记录堆栈跟踪).
  • 确保使用正确版本的InstallUtil(即32位或64位)来安装服务.更好的是,让服务使用ManagedInstallerClass.InstallHelper安装自己.

  • 所以真的需要一个"合并答案"功能,所以我们都可以正确:).尤其是这些主观的"列表"类型问题. (2认同)

The*_*edi 15

  • 请务必使用跟踪/日志记录API来获取诊断信息.事件日志,日志文件,数据库,等等...只是在某处有故障排除信息.
  • 早期和经常跟踪/记录.没有什么比进行代码更改更令人沮丧的了,这只是为了添加诊断跟踪.
  • 认识到记忆泄漏.在编写将每天重新启动或作为计划任务运行的应用程序时,有时我们会有点懒惰.请记住,此服务需要彻底清理.正确使用所有IDisposable的using子句.
  • 不要忘记STOP变量上的volatile关键字!我的上帝每次都会得到我.