使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM