再谈Windows Service - 一个简单的自我例子和部署
我们的服务需要做两件自动的事情,一个是往表格中定时插入数据,另一个就是
往文件中定时插入内容
因此,我们需要做一个工作类,这个类可以是一个抽象类,如下:
TaskWorker
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
namespace WinConsoleService
{
public abstract class TaskWorker
{
private static readonly ILog logger = LogManager.GetLogger(typeof(TestTaskWorker));
public bool Pause { get; set; }
public bool Stop { get; set; }
public abstract void Run();
}
}
我们实际的工作任务是需要继承该抽象类的两个实体类,如下:
DbTaskWorker
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WinConsoleService.DAL;
using System.Configuration;
using System.Diagnostics;
using log4net;
namespace WinConsoleService
{
public class DbTaskWorker: TaskWorker
{
//private static readonly ILog logger = LogManager.GetLogger(typeof(TestTaskWorker));
public bool Pause { get; set; }
public bool Stop { get; set; }
public override void Run()
{
//logger.Info("Test Task Work Started ...");
while (!Stop)
{
if (Pause)
continue;
Do();
Thread.Sleep(int.Parse(ConfigurationManager.AppSettings["WakeupInterval"]));
}
}
private void Do()
{
SqlDbUtil db = new SqlDbUtil();
string sql = @"insert into Test2
values('1', '2' , '3')";
int ret = db.ExecuteSQL(sql);
if (ret == -1)
FileUtil.WriteLog("Exception: database insert error!");
}
}
}
FileTaskWorker
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Diagnostics;
using System.Configuration;
using log4net;
namespace WinConsoleService
{
public class FileTaskWorker : TaskWorker
{
private static readonly ILog logger = LogManager.GetLogger(typeof(FileTaskWorker));
public override void Run()
{
while (!Stop)
{
if (Pause)
continue;
Do();
Thread.Sleep(int.Parse(ConfigurationManager.AppSettings["WakeupInterval"]));
}
}
private void Do()
{
FileStream fs = new FileStream("E:\\PerformanceLog_" + DateTime.Now.ToString("yyyyMMdd") + ".log", FileMode.Append);
StreamWriter streamWriter = new StreamWriter(fs);
streamWriter.BaseStream.Seek(0, SeekOrigin.End);
streamWriter.WriteLine(DateTime.Now);
streamWriter.Flush();
streamWriter.Close();
}
}
}
由于Windows Service调试起来比较困难,因此我做了一个文件日志,本来
考虑用log4net,但是log4net经常抽疯,所以还是自己做一个吧
FileUtil
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace WinConsoleService
{
public class FileUtil
{
public static void WriteLog(string ex)
{
/*
FileStream fs = new FileStream("C:\\test.log", FileMode.Append);
StreamWriter streamWriter = new StreamWriter(fs);
streamWriter.BaseStream.Seek(0, SeekOrigin.End);
streamWriter.WriteLine(ex);
streamWriter.Flush();
*/
StreamWriter sw = File.AppendText("C:\\test.log");
sw.WriteLine(ex);
sw.Close();
}
}
}
服务主体代码如下:
Service1.cs
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Threading;
using log4net;
namespace WinConsoleService
{
public partial class Service1 : ServiceBase
{
private TaskWorker worker;
ILog logger = LogManager.GetLogger(typeof(Service1));
public Service1()
{
FileUtil.WriteLog("Windows Service Start");
InitializeComponent();
this.worker = new FileTaskWorker();
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = e.ExceptionObject as Exception;
FileUtil.WriteLog("来自Service1的全局异常, " + ex.Message + "详细信息如下:"
+ Environment.NewLine + "[InnerException]" + ex.InnerException
+ Environment.NewLine + "[Source]" + ex.Source
+ Environment.NewLine + "[TargetSite]" + ex.TargetSite
+ Environment.NewLine + "[StackTrace]" + ex.StackTrace);
}
catch { }
}
protected override void OnStart(string[] args)
{
FileUtil.WriteLog("OnStart");
Thread t = new Thread(new ThreadStart(this.worker.Run));
t.Start();
}
protected override void OnStop()
{
FileUtil.WriteLog("OnStop");
this.worker.Stop = true;
this.worker.Pause = true;
}
protected override void OnPause()
{
FileUtil.WriteLog("OnPause");
this.worker.Pause = true;
}
protected override void OnContinue()
{
FileUtil.WriteLog("OnContinue");
this.worker.Pause = false;
}
}
}
控制台入口
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using log4net.Config;
namespace WinConsoleService
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
XmlConfigurator.Configure();
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
}
}
最后,再次谈一下部署
首先,如果你用的是.NET4.0, 需要找到该目录:
C:\Windows\Microsoft.NET\Framework\v4.0.30319
然后,记住一定要把该路径添加到环境变量的path路径
如果是windows7的用户, 请记住一定要在管理员情况下运行Visual Studio Command Prompt
然后,把你Debug目录下的文件统统拷贝到记得服务目录,运行该命令
cd 服务目录
InstallUtil WinConsoleService.exe
这样,服务就部署完成了,以后重新修改服务,只要停止服务,覆盖原来的文件就好了
转载于:https://www.cnblogs.com/davidgu/archive/2012/07/10/2585057.html
再谈Windows Service - 一个简单的自我例子和部署相关推荐
- mvc登录实例 mysql_spring mvc + mybatis + mysql 调整的一个简单的登录例子
spring mvc + mybatis + mysql 整合的一个简单的登录例子 今天用spring跟mybatis整合写了一个简单的登录例子,第一次整合,给自己做个笔记,可能注释写的有点少,做的不 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- boost::log模块实现一个简单日志的例子
boost::log模块实现一个简单日志的例子 实现功能 C++实现代码 实现功能 boost::log模块实现一个简单日志的例子 C++实现代码 #include <boost/log/tri ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world. ...
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子
我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...
- 决策树分析例题经典案例_决策树原理及一个简单的小例子
首先通过两个图来引入什么是决策树. 是否学习的决策过程 决策树是仿树结构来进行决策的,例如上图来说,我们要对'是否学习'这个问题进行决策时,通常伴随一系列的子决策.先看是否有'对象',有的话是否需要' ...
- Python网络爬虫 - 一个简单的爬虫例子
下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request import urlopen f ...
- python网页爬虫例子_Python网络爬虫 - 一个简单的爬虫例子
下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request importurlopenfro ...
最新文章
- 机器学习入门(16)— CNN 池化层概念和特征
- hdu 1003 Max Sum
- ubuntu adb 调试手机
- .net pdf转图片_图片转PDF怎么转?推荐两种图片转PDF方法
- 华为21级程序员月薪曝光:270k封神!众网友直呼长见识……
- 学习笔记-java编程-交通灯管理器设计流程。
- 【剑指offer】面试题16:数值的整数次方(Java)
- php抓取页面生成html,PHP smiple html dom抓取页面内容
- 强连通分量(Tarjan算法)
- 深度IP转换器高匿名8级加密企业级专用IP软件
- js用blob下载pdf文件打开后中文乱码
- 小菜成长记---【proxy 代理模式 ---西门庆干潘金莲——王婆做代理】
- css 语音,CSS3新特性一览-- 语音
- Intel的ipp库(Integrated Performance Primitives)
- SYSTEM_INFO
- SVN服务器管理工具——VisualSVN Server Manager
- All in 区块链的百度昨日发布了白皮书,说了些什么?
- Linux操作系统知识点(上)
- 西瓜书入门辅助【机器学习 周志华】一些关于机器学习的重要基础概念提炼
- 个人简历模板下载 2020个人简历模板 下载空白简历个人简历
热门文章
- 关于R和Python的安全机制
- python随机选取列表中的一个字符串_如何从Python中的列表中选择随机字符串?
- 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别
- 数学建模记录(如何组织,如何参加)(一)
- LeetCode 148. Sort List--面试算法题--C++,Python解法
- LeetCode 468. Validate IP Address--笔试题--Python解法
- 对象是否要被回收(引用计数和可达性分析算法)
- java开发编程周末班_今天,Java编程周末提高班(第一期)正式结束
- base64是哪个jar包的_如何通过一个类名找到它属于哪个jar包?
- pygame简单的俄罗斯方块游戏和简单的打字游戏