使用C#创建windows服务续之使用Topshelf优化Windows服务

简介: 前言:之前写了一篇“使用C#创建windows服务”,https://www.cnblogs.com/huangwei1992/p/9693167.html,然后有博友给我推荐了一个开源框架Topshelf。

前言:

之前写了一篇“使用C#创建windows服务”,https://www.cnblogs.com/huangwei1992/p/9693167.html,然后有博友给我推荐了一个开源框架Topshelf。

写了一点测试代码,发现Topshelf框架确实在创建windows服务上非常好用,于是就对我之前的代码进行了改造。

开发流程:

1.在不使用Topshelf框架的情况下,我们需要创建Windows服务程序,在这里我们只需要创建一个控制台程序就行了

2.添加引用

使用程序安装命令:

  • Install-Package Topshelf

直接在NuGet包管理器中搜索 Topshelf,点击安装即可:

3.新建核心类CloudImageManager

主要方法有三个:LoadCloudImage、Start、Stop,直接贴代码

/// <summary>
    /// 功能描述    :卫星云图下载管理器  
    /// 创 建 者    :Administrator
    /// 创建日期    :2018/9/25 14:29:03 
    /// 最后修改者  :Administrator
    /// 最后修改日期:2018/9/25 14:29:03 
    /// </summary>
    public class CloudImageManager
    {
        private string _ImagePath = System.Configuration.ConfigurationManager.AppSettings["Path"];
        private Timer _Timer = null;
        private double Interval = double.Parse(System.Configuration.ConfigurationManager.AppSettings["Minutes"]);
        public CloudImageManager()
        {
            _Timer = new Timer();
            _Timer.Interval = Interval * 60 * 1000;
            _Timer.Elapsed += _Timer_Elapsed;
        }
        void _Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            StartLoad();
        }
        /// <summary>
        /// 开始下载云图
        /// </summary>
        private void StartLoad()
        {
            LoadCloudImage();
        }
        public void Start()
        {
            StartLoad();
            _Timer.Start();
        }
        public void Stop()
        {
            _Timer.Stop();
        }
        /// <summary>
        /// 下载当天所有卫星云图
        /// </summary>
        private void LoadCloudImage()
        {
            CreateFilePath();//判断文件夹是否存在,不存在则创建
            //获取前一天日期
            string lastYear = DateTime.Now.AddDays(-1).Year.ToString();
            string lastMonth = DateTime.Now.AddDays(-1).Month.ToString();
            if (lastMonth.Length < 2) lastMonth = "0" + lastMonth;
            string lastDay = DateTime.Now.AddDays(-1).Day.ToString();
            if (lastDay.Length < 2) lastDay = "0" + lastDay;
            //获取当天日期
            string year = DateTime.Now.Year.ToString();
            string month = DateTime.Now.Month.ToString();
            if (month.Length < 2) month = "0" + month;
            string day = DateTime.Now.Day.ToString();
            if (day.Length < 2) day = "0" + day;
            //设置所有文件名
            string[] dates0 = { lastYear + "/" + lastMonth + "/" + lastDay, year + "/" + month + "/" + day };
            string[] dates = { lastYear + lastMonth + lastDay, year + month + day };
            string[] hours = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" };
            string[] minutes = { "15", "45" };
            int hLength = hours.Count();
            //遍历下载当天所有在线云图
            for (int i = 0; i < 2; i++)
            {
                string date = dates[i];
                string date0 = dates0[i];
                for (int j = 0; j < hLength; j++)
                {
                    string hour = hours[j];
                    for (int k = 0; k < 2; k++)
                    {
                        string minute = minutes[k];
                        string imageUrl = @"http://image.nmc.cn/product/" + date0 + @"/WXCL/SEVP_NSMC_WXCL_ASC_E99_ACHN_LNO_PY_" + date + hour + minute + "00000.JPG";
                        string[] s = imageUrl.Split('/');
                        string imageName = s[s.Count() - 1];

                        HttpWebRequest request = HttpWebRequest.Create(imageUrl) as HttpWebRequest;
                        HttpWebResponse response = null;
                        try
                        {
                            response = request.GetResponse() as HttpWebResponse;
                        }
                        catch (Exception)
                        {
                            continue;
                        }

                        if (response.StatusCode != HttpStatusCode.OK) continue;
                        Stream reader = response.GetResponseStream();
                        FileStream writer = new FileStream(_ImagePath + imageName, FileMode.OpenOrCreate, FileAccess.Write);
                        byte[] buff = new byte[512];
                        int c = 0; //实际读取的字节数
                        while ((c = reader.Read(buff, 0, buff.Length)) > 0)
                        {
                            writer.Write(buff, 0, c);
                        }
                        writer.Close();
                        writer.Dispose();
                        reader.Close();
                        reader.Dispose();
                        response.Close();
                    }
                }
            }
        }
        /// <summary>
        /// 判断文件夹是否存在,不存在则创建
        /// </summary>
        private void CreateFilePath()
        {
            if (Directory.Exists(_ImagePath))
            {
                ClearImages();
                return;
            }
            else
            {
                Directory.CreateDirectory(_ImagePath);
            }
        }
        /// <summary>
        /// 清空文件夹下所有文件
        /// </summary>
        private void ClearImages()
        {
            try
            {
                DirectoryInfo dir = new DirectoryInfo(_ImagePath);
                FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();  //返回目录中所有文件和子目录
                foreach (FileSystemInfo i in fileinfo)
                {
                    if (i is DirectoryInfo)            //判断是否文件夹
                    {
                        DirectoryInfo subdir = new DirectoryInfo(i.FullName);
                        subdir.Delete(true);          //删除子目录和文件
                    }
                    else
                    {
                        File.Delete(i.FullName);      //删除指定文件
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }

 然后在Program.cs中调用:

static void Main(string[] args)
        {
            HostFactory.Run(x =>                                 //1
            {
                x.Service<CloudImageManager>(s =>                        //2
                {
                    s.ConstructUsing(name => new CloudImageManager());     //3
                    s.WhenStarted(tc => tc.Start());              //4
                    s.WhenStopped(tc => tc.Stop());               //5
                });
                x.RunAsLocalSystem();                            //6

                x.SetDescription("卫星云图实时下载工具");        //7
                x.SetDisplayName("CloudImageLoad");                       //8
                x.SetServiceName("CloudImageLoad");                       //9
            });
        }

可以看到调用的时候主要涉及到CloudImageManager类中的构造函数、Start方法以及Stop方法

安装、运行和卸载:

在Topshelf框架下进行服务的这些操作相对而言就简单多了

安装:Topshelf.CloudImageLoad.exe install
启动:Topshelf.CloudImageLoad.exe start
卸载:Topshelf.CloudImageLoad.exe uninstall
操作界面如下:(注意:必须用管理员身份运行命令提示符)
在这里只贴出了安装命令的截图,其他命令相信就不用多说了。
查看服务列表,这时我们的服务就已经安装成功了
 
参考链接:
http://www.cnblogs.com/jys509/p/4614975.html
目录
相关文章
|
4天前
|
C# Windows
C# 创建 Windows Service 项目
C# 创建 Windows Service 项目
14 1
|
5天前
|
Java Windows
SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
18 2
|
7天前
|
编解码 开发工具 Android开发
Windows平台RTMP推送|轻量级RTSP服务如何实现摄像头叠加到屏幕输出
大牛直播SDK采用先进的图层概念实现视频叠加,如将摄像头画面实时叠加到屏幕输出,以C#为例展示了具体的配置方法。用户可在推送RTMP或启动RTSP服务前选择“摄像头叠加到屏幕”的选项,并调整位置。SDK还支持摄像头的开启与关闭、水平垂直翻转及旋转等功能。此外,该SDK提供了丰富的特性,包括但不限于视频和音频采集处理、硬编码与软编码支持、多实例推送、水印添加、网络适应性调整等,几乎涵盖了RTMP推送的所有常规需求,并能与播放器协同工作达到毫秒级的低延迟,非常适合无纸化同屏、智慧教室等应用场景。
|
7天前
|
开发工具 数据安全/隐私保护 开发者
Windows平台RTMP推送|轻量级RTSP服务摄像头如何添加动态文字水印
本文介绍了在Windows平台上实现摄像头或屏幕流中动态文字水印的技术方法。通过大牛直播SDK示例,展示了如何从文本获取RGB数据,并将其叠加到视频流上。文中提供了代码片段来说明如何开启文字水印、生成包含实时信息的位图、以及如何更新和控制图层。最终实现了动态显示时间和位置信息的需求。对这一领域的开发者而言,本文提供了实用的参考与指导。
|
7天前
|
编解码 Linux 开发工具
如何启动Windows平台轻量级RTSP服务生成RTSP拉流URL
为满足内网超低延迟需求,我们开发了轻量级RTSP服务模块,避免用户额外部署服务器。此模块集成于推送端SDK中,支持Windows、Linux、Android及iOS平台,可将本地音视频数据编码后通过RTSP协议提供。具备RTSP鉴权、单播/组播等功能,支持H.264/H.265编码,同时可创建多个服务实例,并查询连接数。实测总延迟约200-300毫秒,兼具稳定与高效。
EMQ
|
1月前
|
物联网 Linux C语言
在 Windows 平台搭建 MQTT 服务
NanoMQ 有着强大的跨平台和可兼容能力,不仅可以用于以 Linux 为基础的各类平台,也为 Windows 平台提供了 MQTT 服务的新选择。
EMQ
82 4
在 Windows 平台搭建 MQTT 服务
|
5天前
|
Java 数据安全/隐私保护 Windows
Windows Service 服务中,不能访问挂载目录(网络映射盘)
Windows Service 服务中,不能访问挂载目录(网络映射盘)
13 0
|
6天前
|
编解码 开发工具 C#
Windows电脑如何启动RTSP服务实现本地摄像头数据共享
本文介绍如何利用大牛直播SDK中的轻量级RTSP服务,在Windows平台上轻松采集摄像头数据并生成本地RTSP流。通过SDK提供的SmartPublisherDemo工具,用户能简便地选择摄像头、配置分辨率与帧率,并启动RTSP服务。此外,还支持音频采集、多端口服务以及动态水印等功能。生成的RTSP URL可用于其他终端拉流播放,无需额外部署服务器。该服务适配多种应用场景,如安防监控、电子教室等,并兼容Windows 7及以上版本。对于希望集成此功能的开发者,SDK提供了C++及C#接口,并支持多种编译模式。
|
7天前
|
监控 开发工具 数据安全/隐私保护
Windows平台如何实现多路RTSP|RTMP流合成后录像或转发RTMP服务
本文介绍了在Windows平台上实现多路RTSP/RTMP视频流的合并技术。主要应用场景包括驾考、全景摄像头以及多路会议录制等。技术实现上,文章详细展示了如何使用特定的SDK来解码并回调YUV或RGB数据,再将这些数据按照图层形式进行合成。示例代码中给出了初始化参数、设置视频帧回调函数、以及如何配置不同图层的具体步骤。最终,合成后的视频可以推送到RTMP服务器、注入到本地RTSP服务,或是直接录制为MP4文件。此外,还提供了添加实时文字水印的方法,并展示了四路视频流合成后的“四宫格”效果。
|
1月前
|
安全 Windows
Microsoft Windows远程桌面服务远程执行代码漏洞(CVE-2019-0708)
Microsoft Windows远程桌面服务远程执行代码漏洞(CVE-2019-0708)
35 2