资讯专栏INFORMATION COLUMN

在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

UCloud / 3566人阅读

摘要:本文首发于码友网一个专注开发的编程爱好者社区。只是为了演示,所以客户端并没有实际意义的逻辑和功能,在文件中,添加如下示例代码这是一个由码友网创建的系统示例程序,目前正在运行技术支持码友网仅此而已。

本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区。

文章目录

C#/.NET基于Topshelf创建Windows服务的系列文章目录:

C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载 (1)

在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务) (2)

C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 (3)

前言

在上一篇文章《C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载》中,我们了解发C#/.NET创建基于Topshelf Windows服务程序的大致流程,参数配置以及服务的安装和卸载。同时,我们也使用一个简单的定时任务演示了Topshelf服务的执行情况。

今天我将继续为大家分享关于Topshelf主题的技术文章。本文主要演示在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)。

创建一个演示应用程序

首先,打开之前我们创建的[TopshelfDemoService.sln]解决方案。在这个解决方案中再创建一个名为TopshelfDemo.Client的客户端控制台应用程序,这个客户端程序即是我们需要使用[TopshelfDemoService]守护的。只是为了演示,所以客户端并没有实际意义的逻辑和功能,在Program.cs文件中,添加如下示例代码:

using System;

namespace TopshelfDemo.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("这是一个由[码友网]创建的ERP系统示例程序,目前正在运行...");
            Console.WriteLine("技术支持:码友网(https://codedefautl.com) by Rector");
            Console.ReadLine();
        }
    }
}

仅此而已。

编写好后,生成或者运行一下这个项目。你会看到一个控制台应用程序界面,如:

实现守护程序功能

再回到项目[TopshelfDemoService]中,打开类文件HealthMonitorService.cs,其中的定时功能演示的是一个检查某系统健康状况的任务,现在我们把定时任务功能改为守护某个或者某些应用程序。

这里为了演示方便,没有重新创建服务类,在实际项目中,你也可以根据自己的情况创建不同的服务类。

修改其中代码为如下所示:

using System;
using System.Collections.Generic;
using System.Timers;

namespace TopshelfDemoService
{
    internal class HealthMonitorService
    {
        /// 
        /// 检测周期计时器
        /// 
        private readonly Timer _timer;
        /// 
        /// 检测周期(秒)
        /// 
        private int _monitorInterval = 10;
        /// 
        /// 要守护的应用程序列表
        /// 
        private List _daemonApps { get; set; }

        public HealthMonitorService()
        {
            // 初始化要守护的应用程序列表
            // 实际项目中,你可以将这里的初始化参数放到配置文件/数据库/缓存中(怎么方便怎么来)
            _daemonApps = new List {
                new DaemonApplicationInfo {
                    ProcessName ="TopshelfDemo.Client",     // 请根据你的情况填写
                    AppDisplayName ="TopshelfDemo Client", // 请根据你的情况填写
                    AppFilePath =@"D:ProjectsgithubTopshelfDemoServiceTopshelfDemo.ClientinDebugTopshelfDemo.Client.exe" // 这里的路径请根据你的实际情况填写
                }
            };
            _timer = new Timer(_monitorInterval*1000) { AutoReset = true };
            _timer.Elapsed += (sender, eventArgs) => Monitor();
        }

        /// 
        /// 守护应用程序的方法
        /// 
        private void Monitor()
        {
            foreach (var app in _daemonApps)
            {
                // 判断当前进程是存已启动
                if (ProcessorHelper.IsProcessExists(app.ProcessName))
                {
                    Console.WriteLine("Application[{0}] already exists.", app.ProcessName);
                    return;
                }
                try
                {
                    // 当前主机进程列表中没有需要守护的进程名称,则启动这个进程对应的应用程序
                    ProcessorHelper.RunProcess(app.AppFilePath, app.Args);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Start application failed:{0}", ex);
                }
            }            
        }

        public void Start()
        {
            _timer.Start();
        }
        public void Stop()
        {
            _timer.Stop();
        }
    }
}

新建类DaemonApplicationInfo.csProcessorHelper.cs,编写如下代码。

DaemonApplicationInfo.cs(需守护的应用程序实体类):

namespace TopshelfDemoService
{
    /// 
    /// 需守护的应用程序实体
    /// 
    public class DaemonApplicationInfo
    {
        /// 
        /// 进程中显示的名称
        /// 
        public string ProcessName { get; set; }
        /// 
        /// 应用程序安装路径
        /// 
        public string AppFilePath { get; set; }
        /// 
        /// 应用程序的名称
        /// 
        public string AppDisplayName { get; set; }

        /// 
        /// 参数
        /// 
        public string Args { get; set; }
    }
}

ProcessorHelper.cs(进程处理帮助类):

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace TopshelfDemoService
{
    /// 
    /// 进程处理帮助类
    /// 
    internal class ProcessorHelper
    {
        /// 
        /// 获取当前计算机所有的进程列表(集合)
        /// 
        /// 
        public static List GetProcessList()
        {
            return GetProcesses().ToList();
        }

        /// 
        /// 获取当前计算机所有的进程列表(数组)
        /// 
        /// 
        public static Process[] GetProcesses()
        {
            var processList = Process.GetProcesses();
            return processList;
        }

        /// 
        /// 判断指定的进程是否存在
        /// 
        /// 
        /// 
        public static bool IsProcessExists(string processName)
        {
            return Process.GetProcessesByName(processName).Length > 0;
        }

        /// 
        /// 启动一个指定路径的应用程序
        /// 
        /// 
        /// 
        public static void RunProcess(string applicationPath, string args = "")
        {
            try
            {
                var psi = new ProcessStartInfo
                {
                    FileName = applicationPath,
                    WindowStyle = ProcessWindowStyle.Normal,
                    Arguments = args
                };
                Process.Start(psi);
            }
            catch{}
        }
    }
}

完成以上编码后,我们将项目程序[TopshelfDemo.Client]和[TopshelfDemoService]先都关闭掉(如果已运行),接着运行项目[TopshelfDemoService],下面就是见证奇迹的时刻啦:

可以看到,守护程序[TopshelfDemoService]自动启动了客户端程序[TopshelfDemo.Client.exe],并且只会启动一个客户端实例程序。当我们把客户端关闭后,下次守护程序检测的时候客户端程序又会被重启。

遗留问题

如果你正高高兴兴地将TopshelfDemoService作为Windows服务安装,那么你可能会遇到这个问题,即守护进程正常运行,客户端程序也能正常地被守护并且启动,在Windows的"任务管理器"中也可以找到客户端的进程,但却看不到客户端程序的UI界面。

这是怎么回事呢???是不是哪里出错了呢???应该如何解决呢???

预知后事如何请听下回分解(未完待续)...

好了,今天的在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)的分享就到这里。

我是Rector,希望本文对C#/.NET开发的你有所帮助。

源代码下载

本示例代码托管地址可以在原出处找到:示例代码下载地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110544.html

相关文章

  • C#/.NET基于TopshelfWindows服务守护程序作为服务启动客户端桌面程序不显示

    摘要:重新编译服务程序项目,并将它作为服务安装,最后启动服务。守护进程服务将启动一个带界面的客户端程序。大功告成我是,希望本文的关于服务和守护程序设计对需要的朋友有所帮助。 本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区。 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf创建Window...

    light 评论0 收藏0
  • C#/.NET基于TopshelfWindows服务程序服务安装和卸载

    摘要:如果我们希望定时任务可以一直运行,那需要将这个控制台应用程序作为服务安装到服务进程中,如何操作呢非常简单的安装和卸载命令。启动恢复服务模式当服务意外停止后自动恢复。设置服务在服务中的显示名称。 本文首发于码友网--一个专注.NET/.NET Core开发的编程爱好者社区。 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Tops...

    Forelax 评论0 收藏0
  • [Docker 官方文档] 理解 Docker

    摘要:将一个轻量级的容器虚拟化平台和一组标准工作流程工具进行集成,来帮助你方便地管理和部署应用。主要包括哪些组件主要包括两个组件开源的容器虚拟化平台用于分享和管理容器的软件即服务平台。 【编者的话】本文来自 Docker 的官方文档,详细介绍了 Docker 的体系结构、重要概念、内部工作机理等内容,推荐不了解 Docker 内部原理的同学阅读。 什么是 Docker? Docker 是...

    cncoder 评论0 收藏0
  • Docker学习笔记

    摘要:通过类似的操作来方便用户获取分发和更新应用镜像,指令简明,学习成本较低。例如存放操作系统镜像的仓库,称为仓库,其中可能包括等不同版本的镜像。管理服务如使用实际上是执行了命令。启动使用即退出容器,并后台运行。 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制...

    jk_v1 评论0 收藏0
  • 代码 - 收藏集 - 掘金

    摘要:行代码的人脸识别实践产品掘金前言很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上页的教程立马就放弃了。掘金最新最全的开源项目合集掘金是由整理并维护的安卓相关开源项目库集合。 安卓第三方登录之微信登录(图文详解) - Android - 掘金一、创建应用并成为开发者 1、创建应用 1)到微信开放平台管理中心,点击创建移动应用 ... 三步实现...

    neuSnail 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<