前言:

之前写了一篇“使用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

使用C#创建windows服务续之使用Topshelf优化Windows服务的更多相关文章

  1. Quartz+TopShelf实现Windows服务作业调度

    Quartz:首先我贴出来了两段代码(下方),可以看出,首先会根据配置文件(quartz.config),包装出一个Quartz.Core.QuartzScheduler instance,这是一个调 ...

  2. Windows Azure HandBook (2) Azure China提供的服务

    <Windows Azure Platform 系列文章目录> 对于传统的自建数据中心,从底层的Network,Storage,Servers,Virtualization,中间层的OS, ...

  3. 使用Topshelf 开发windows服务

    在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发.如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 ...

  4. Windows Azure案例分析: 选择虚拟机或云服务?

    作者 王枫 发布于2013年6月27日 随着云计算技术和市场的日渐成熟,企业在考虑IT管理和运维时的选择也更加多样化,应用也从传统部署方式,发展为私有云.公有云.和混合云等部署方式.作为微软核心的公有 ...

  5. rsync (windows 服务端,linux客户端)将windows上的数据同步到linux服务器,反之也可

    一:总体概述. 1.windows上面首先装CW_rsync_Server.4.1.0_installer,安装时要输入的用户名密码要记住哦!接下来就是找到rsyncd.conf进入配置细节 2.li ...

  6. Windows Server 2016-命令行方式管理Windows服务

    Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序. 这些服务可在计算机启动时自动启动,可以暂停和重启,并且不显 ...

  7. topshelf 开发windows 服务资料

    官方配置 http://docs.topshelf-project.com/en/latest/configuration/config_api.html#service-start-modes to ...

  8. Windows Azure中WebSite 网站, Cloud Service 云服务,Virtual Machine 虚拟机的比较

    在Windows Azure服务平台里,Web Site特点是: 在Windows Azure上构建高度可扩展的Web站点. 快速.轻松部署一个高度可扩展的云环境,并且可以从很小的规模开始. 使用您所 ...

  9. quartz.net结合Topshelf实现windows service服务托管的作业调度框架

    topshelf可以很简单方便的实现windows service服务,详见我的一篇博客的介绍 http://www.cnblogs.com/xiaopotian/articles/5428361.h ...

随机推荐

  1. 【SQL模板】一.修改/新增存储过程TSQL

    ---Name: 创建存储过程模板.sql ---Purpose: 用于创建 数据库中 新的存储过程 ---Author: xx ---Time: 2015-12-18 10:26:06 ---Rem ...

  2. DNA motif 搜索算法总结

    DNA motif 搜索算法总结 2011-09-15 ~ ADMIN 翻译自:A survey of DNA motif finding algorithms, Modan K Das et. al ...

  3. csv中文乱码

    处理办法:https://jingyan.baidu.com/album/3c48dd3464b46ce10be3581f.html?picindex=2

  4. [Selenium]显式等待 Explicit wait & 隐式等待 Implicit wait

    显式等待 Explicit wait 显示等待 , 就是明确的要等到某个元素出现或者某个元素满足某种条件,每隔一段时间检查一次,等不到,就一直等,如果在规定的时间内还没有找到,就跳出来检查间隔的时间和 ...

  5. Java数据结构和算法(一)树

    Java数据结构和算法(一)树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 前面讲到的链表.栈和队列都是一对一的线性结构, ...

  6. 2017年值得一看的7个APP设计

    新媒体时代蓬勃发展,各类APP如雨后春笋般出现.下载到合适的APP,不仅衣食住行一键搞定,甚至健身.社交.阅读等需求也能足不出户地满足.对于广大“吃瓜群众”来说,选择APP是个人需求以及跟随潮流的选择 ...

  7. 【DBCP】DBCP基本配置和重连配置+spring中配置

    最近在看一些dbcp的相关内容,顺便做一下记录,免得自己给忘记了.   1. 引入dbcp (选择1.4) <dependency> <groupId>com.alibaba. ...

  8. NET(C#)连接各类数据库-集锦

    1.C#连接连接Access程序代码:------------------------------------------------------------------------------- u ...

  9. 2018.10.05 NOIP模拟 上升序列(状压dp)

    传送门 状压dp好题. 首先需要回忆O(nlogn)O(nlog n)O(nlogn)求lislislis的方法,我们会维护一个单调递增的ddd数组. 可以设计状态f(s1,s2)f(s1,s2)f( ...

  10. 打开yii2控制台命令

    1.在控制台中切换到yii2控制台入口文件的工作路径.如:C:\users\2016-01>D:www\blogdemo\yii