Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 引发异常时重新启动服务_Vb.net_Windows Services - Fatal编程技术网

Vb.net 引发异常时重新启动服务

Vb.net 引发异常时重新启动服务,vb.net,windows-services,Vb.net,Windows Services,我正在编写一个需要全天候运行的windows服务。这是一个非常简单的服务,它监视文件放入的目录并处理这些文件。如果引发未处理的异常,我需要重新启动服务 如果出现未经处理的异常,是否有办法让服务重新启动自身?您是否尝试过使用服务条目的“恢复”选项卡-您可以设置故障规则,包括“重新启动服务”-默认情况下,此选项为“无操作”将您的服务代码包装在一个运行程序中,该运行程序可以捕获任何错误并重新启动您的服务。最好的方法是将Try/catch块包装在服务中您可以允许抛出异常的方法周围 但是,可能会引发严重异

我正在编写一个需要全天候运行的windows服务。这是一个非常简单的服务,它监视文件放入的目录并处理这些文件。如果引发未处理的异常,我需要重新启动服务


如果出现未经处理的异常,是否有办法让服务重新启动自身?

您是否尝试过使用服务条目的“恢复”选项卡-您可以设置故障规则,包括“重新启动服务”-默认情况下,此选项为“无操作”

将您的服务代码包装在一个运行程序中,该运行程序可以捕获任何错误并重新启动您的服务。

最好的方法是将Try/catch块包装在服务中您可以允许抛出异常的方法周围

但是,可能会引发严重异常,导致服务立即停止。不要忽视这些!在这些情况下,处理异常、记录异常、通过电子邮件发送异常,然后重新发送异常。这样,您将被告知异常已发生,并将知道发生了什么错误。然后,您可以修复问题并手动重新启动服务


忽略它可能会在系统中导致您不知道的重大故障。如果服务停止,然后重新启动,然后无限期停止,则CPU/RAM的成本也可能非常高。

服务小程序具有许多不同的恢复功能:

它可以对第一次、第二次和后续故障采取不同的操作:

  • 在可配置的延迟后重新启动服务
  • 运行程序(传递命令行参数,可能包括故障计数)
  • 重新启动计算机(经过可配置的延迟,并发送特定消息)
运行的程序应该能够查看事件日志并查看失败的原因(尤其是在您记录它的情况下),因此,如果异常是不可恢复的,则应该能够禁用服务

当然,在此期间,服务应该记录正在发生的事情,这应该使任何管理工具能够通知操作正在发生的事情


我同意您可能不应该将“第三次和后续”配置为“重新启动服务”,否则您可能会陷入循环。

如果您愿意,这可以通过编程完成,此代码不是我编写的。我正在发布包含源代码/二进制文件的Authors CodeProject页面的链接。在链接下面,我解释了如何实现作者代码

  • 添加对DLL的引用

  • 在记事本中打开ProjectInstaller.Designer.vb
    在初始化组件Sub中
    更改
    Me.serviceprocesinstaller1=新系统.ServiceProcess.serviceprocesinstaller

    Me.ServiceInstaller1=新系统.ServiceProcess.ServiceInstaller


    Me.serviceprocesinstaller1=新系统.ServiceProcess.serviceprocesinstaller

    Me.ServiceInstaller1=New-Verifide.ServiceUtils.ServiceInstallerEx

  • 使用ProjectInstaller.Designer.vb中的友元声明
    更改
    Friend WithEvents ServiceProcessInstaller1作为System.ServiceProcess.ServiceProcessInstaller

    Friend WithEvents ServiceInstaller1作为System.ServiceProcess.ServiceInstaller


    Friend WithEvents ServiceProcessInstaller1作为System.ServiceProcess.ServiceProcessInstaller

    Friend WithEvents ServiceInstaller1 As Verifide.ServiceUtils.ServiceInstallerEx

  • 更改
    Me.Installers.AddRange(新的System.Configuration.Install.Installer(){Me.ServiceProcessInstaller1,Me.ServiceInstaller1})


    Me.Installers.AddRange(New System.Configuration.Install.Installer(){Me.ServiceInstaller1,Me.serviceprocesinstaller1})

  • 在ProjectInstaller.vb上导入命名空间

  • 在ProjectInstaller.vb的Public子函数中,初始化组件函数后的新函数已被调用
    添加
    “设置重置时间计数-这是重置计数前的4天”

    ServiceInstaller1.FailCountResetTime=60*60*24*4

    'ServiceInstaller1.FailRebootMsg=“休斯顿!我们有问题”

    '添加故障操作

    ServiceInstaller1.FailureActions.Add(新的FailureAction(RecoverAction.Restart,60000))

    ServiceInstaller1.FailureActions.Add(新的FailureAction(RecoverAction.Restart,60000))

    ServiceInstaller1.FailureActions.Add(新的FailureAction(RecoverAction.None,3000))

    ServiceInstaller1.StartOnInstall=True

  • 构建安装程序并安装。瞧

  • 正如“约翰·桑德斯”和“theGecko”所建议的,您可以监视服务,并在服务失败时重新启动它。内置的Windows服务恢复功能将为您带来很多帮助,但是如果您发现需要一些更高级的功能(例如,占用CPU和挂起检测),请退出。它旨在让您的重要Windows服务全天候运行


    祝你好运

    我甚至没有意识到这是可用的。谢谢我会小心这样做。如果每次服务启动时都会引发严重异常,那么会发生什么?你怎么知道?我不是说这是一个好主意-我是说这是可以做到的…到那一点,真正的问题是为什么你会计划有未处理的异常,而不是捕获它们,如果这很关键,从代码中停止服务。你可以设置服务来计算失败的数量,对于第一次、第二次和第三次失败,您可以指定不同的操作。您还可以将失败计数附加到命令行,并在这么多天后重置失败计数。它在Vista之前可用吗?我似乎还记得,它是刚刚添加的