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