我是靠谱客的博主 俊逸裙子,最近开发中收集的这篇文章主要介绍C# Windows Services 服务C# Windows Service-基础教程2. 创建服务时需注意,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
C# Windows Service-基础教程
本文介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service 的内容步骤和注意事项。
案例: 应用 windows service 监控电脑cpu和内存使用情况。
- 创建服务
- 安装服务
- 监控cpu服务
- 卸载服务
1、创建一个windows service服务
- OnStart :服务启动的时候执行,
- OnStop:服务停止的时候执行
public partial class Service1 : ServiceBase
{
//服务初始化
public Service1()
{
InitializeComponent();
}
//服务启动时执行的代码
protected override void OnStart(string[] args)
{
}
//服务停止时执行的代码
protected override void OnStop()
{
}
}
1、程序代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ServicesManagementApp
{
static class Program
{
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new ComputerService()
};
ServiceBase.Run(ServicesToRun);
}
}
}
2、监控cpu和内存代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ServicesManagementApp
{
partial class ComputerService : ServiceBase
{
//使用定时器定时执行相应代码
private Timer timer;
public ComputerService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//定时器,每间隔一个3秒行一次------>OnTimerHandler()方法 //2小时执行1次
//timer = new Timer(OnTimerHandler, null, 0, 1000 * 60 * 60* 2 );
timer = new Timer(OnTimerHandler, null, 0, 1000 * 3);
// TODO: 在此处添加代码以启动服务。
}
protected override void OnStop()
{
timer.Dispose();
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
}
private void OnTimerHandler(object state)
{
this.SendService_EarlyWarning();
}
//服务测试方法
private void SendService_EarlyWarning()
{
//上次记录CPU的时间
List<decimal> cpuNumList = new List<decimal>();
List<decimal> memoryNumList = new List<decimal>();
TimeSpan prevCpuTime = TimeSpan.Zero;
//Sleep的时间间隔
//int interval = 1000;
SystemInfo sys = new SystemInfo();
//内存大小单位:GB
const int GB_DIV = 1024 * 1024 * 1024;
int stopnum = 0;
bool cpu_sendmail = false;
bool memory_sendmail = false;
while (true)
{
//第一种方法计算CPU使用率
//计算进程cpu使用
decimal cpuUesd = Math.Round((decimal)sys.CpuLoad, 2);
decimal allMemory = sys.PhysicalMemory / (decimal)GB_DIV;
decimal isUsedMemory = Math.Round((sys.PhysicalMemory - sys.MemoryAvailable) / (decimal)GB_DIV, 2);
decimal Used_ratio = Math.Round((decimal)(isUsedMemory / allMemory) * 100, 2);
//第二章方法获取系统CPU和内存使用情
FileDoUtiles.WriteLogInfo(String.Format("系统CPU使用率:{0}%,系统内存使用大小:{1}GB,内存使用率:{2}%", cpuUesd, isUsedMemory, Used_ratio));
stopnum++;
if (stopnum == 11)
{
break;
}
else
{
cpuNumList.Add(cpuUesd);
memoryNumList.Add(Used_ratio);
}
//Thread.Sleep(interval);
}
decimal sumcpuUesd = 0;
decimal sumMemoryUesd = 0;
foreach (var item in cpuNumList)
{
sumcpuUesd = sumcpuUesd + item;
}
foreach (var item in memoryNumList)
{
sumMemoryUesd = sumMemoryUesd + item;
}
//cpu预警
if ((sumcpuUesd / cpuNumList.Count) > 80)
{
FileDoUtiles.WriteLogInfo($"cpu达到预警线, cpuUesdRatio: {(sumcpuUesd / cpuNumList.Count)} %");
//Console.WriteLine($"cpu达到预警线, cpuUesdRatio: {(sumcpuUesd / cpuNumList.Count)} %");
}
else
{
FileDoUtiles.WriteLogInfo($"cpu未达到预警线, cpuUesdRatio: { (sumcpuUesd / cpuNumList.Count)} %");
//Console.WriteLine($"cpu未达到预警线, cpuUesdRatio: {(sumcpuUesd / cpuNumList.Count)} %");
cpu_sendmail = true;
}
//内存预警
if ((sumMemoryUesd / memoryNumList.Count) > 70)
{
//Console.WriteLine($"内存使用达到预警线, memoryUesdRatio: {(sumMemoryUesd / memoryNumList.Count)} %");
FileDoUtiles.WriteLogInfo($"内存使用达到预警线, memoryUesdRatio: {(sumMemoryUesd / memoryNumList.Count)} %");
}
else
{
//Console.WriteLine($"内存使用未达到预警线, memoryUesdRatio: {(sumMemoryUesd / memoryNumList.Count)} %");
FileDoUtiles.WriteLogInfo($"内存使用未达到预警线, memoryUesdRatio: {(sumMemoryUesd / memoryNumList.Count)} %");
memory_sendmail = true;
}
if (cpu_sendmail && memory_sendmail)
{
//发送cpu、内存超额预警邮件
}
else if (!cpu_sendmail && memory_sendmail)
{
//发送内存超额邮件
}
else if (cpu_sendmail && !memory_sendmail)
{
//发送cpu超额邮件
}
}
}
}
3、安装启动服务
创建一个bat文件,指定启动的服务文件路径,文件脚本内容如下。
@echo.服务启动......
@echo off
@sc create ComputerService binPath= "D:ProjectsServicesManagementAppServicesManagementAppbinDebugServicesManagementApp.exe"
@net start ComputerService
@sc config ComputerService start= AUTO
@echo off
@echo.启动完毕!
@pause
4、卸载服务
创建一个bat文件,指定删除的服务名称—ComputerService,文件脚本内容如下。
@echo.服务删除
@echo off
@sc delete ComputerService
@echo off
@echo.删除结束!
@pause
5、启动服务开始监控
双击bat安装服务文件,即可安装服务。
6、查看服务执行结果
7、卸载服务
双击bat卸载服务文件,即可卸载服务。
2. 创建服务时需注意
1. 添加安装程序
添加安装程序,我们可以看到下图图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。
2. 修改安装服务名
右键serviceInsraller1,选择属性,将ServiceName的值改为ComputerService。
3. 修改安装权限
右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。
最后
以上就是俊逸裙子为你收集整理的C# Windows Services 服务C# Windows Service-基础教程2. 创建服务时需注意的全部内容,希望文章能够帮你解决C# Windows Services 服务C# Windows Service-基础教程2. 创建服务时需注意所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复