zoukankan      html  css  js  c++  java
  • 使用C#创建windows服务续之使用Topshelf优化Windows服务

    前言:

    之前写了一篇“使用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
  • 相关阅读:
    COM组件
    【游戏引擎架构】入门(一)
    UNICODE字符串
    Python随笔10
    Python随笔9-函数
    Python随笔7
    Python随笔6
    Python随笔5
    Python随笔4
    Python随笔3
  • 原文地址:https://www.cnblogs.com/huangwei1992/p/9704732.html
Copyright © 2011-2022 走看看