Windows服务最佳实践

3
由于某些原因(例如,我希望程序能够在系统启动时自动运行并且一直运行),我决定将程序开发为Windows服务应用程序。目前,我的实现方法如下:
  1. 将主要业务逻辑实现为类库。
  2. 实现一个Windows控制台应用程序作为客户端程序,该程序将构建业务对象并定期调用业务逻辑组件。
  3. 开发Windows服务应用程序以启动和停止控制台应用程序。

    3.1 在OnStart方法中启动进程。

    djsProcessStartInfo = new ProcessStartInfo()
        {
                UseShellExecute = false,
                WorkingDirectory = rootDir + depolyDate,
                Arguments = args,
                FileName = rootDir + depolyDate + @"\" + appName                
        };
        try
        {
            djsProcessToRun = Process.Start(djsProcessStartInfo);
        }
        catch(Exception ex)
        {
             ///
        }

3.2 在 OnStop 方法中停止进程。

        if (djsProcessToRun != null)
        {
            try
            {
                djsProcessToRun.Kill();
            }
            catch (Exception ex)
            {
                ///...
            }
        }
        else
        {
            ///...
        }

这是开发Windows服务应用程序的正确方式吗? 当进程djsProcessToRun无法运行时,我遇到了问题,有时我也无法停止它。 是否有最佳实践需要遵循?(例如如何处理异常,如何在Windows服务和目标Windows应用程序之间分离功能���


为什么要创建控制台应用程序?我建议将业务逻辑放在类库中,在Windows服务中编写代码以包含这些文件并执行逻辑,这样您就可以消耗更少的资源,因为不需要维护单独的进程。 - Sumit Gupta
我已经更新了我的问题描述,请再次查看。 - dingx
1个回答

3
更好的做法是使用共享程序集(即类库),然后您可以创建两个客户端来使用共享程序集——测试控制台应用程序和Windows服务。

我已经更新了问题描述。它与您的建议几乎相同,只是服务调用控制台应用程序而不是直接调用类库。因为我想尽可能保持服务的简单性,并且当我更新我的业务逻辑部分时,我不想更改服务并重新安装它。 - dingx
当您重新编译服务时,无需重新安装,只需替换已编译的可执行文件,在停止服务后即可。此外,如果您要求最佳实践,正如我在上面的评论中所说,这建议使用比控制台应用程序更少的资源,并提供更多的灵活性来处理错误。 - Sumit Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接