我们的服务需要做两件自动的事情,一个是往表格中定时插入数据,另一个就是

往文件中定时插入内容

因此,我们需要做一个工作类,这个类可以是一个抽象类,如下:

TaskWorker

using System;
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;
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;
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;
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;
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;
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 - 一个简单的自我例子和部署相关推荐

  1. mvc登录实例 mysql_spring mvc + mybatis + mysql 调整的一个简单的登录例子

    spring mvc + mybatis + mysql 整合的一个简单的登录例子 今天用spring跟mybatis整合写了一个简单的登录例子,第一次整合,给自己做个笔记,可能注释写的有点少,做的不 ...

  2. 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...

  3. boost::log模块实现一个简单日志的例子

    boost::log模块实现一个简单日志的例子 实现功能 C++实现代码 实现功能 boost::log模块实现一个简单日志的例子 C++实现代码 #include <boost/log/tri ...

  4. 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world. ...

  5. 一个简单的CORBA例子

    因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...

  6. java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子

    我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...

  7. 决策树分析例题经典案例_决策树原理及一个简单的小例子

    首先通过两个图来引入什么是决策树. 是否学习的决策过程 决策树是仿树结构来进行决策的,例如上图来说,我们要对'是否学习'这个问题进行决策时,通常伴随一系列的子决策.先看是否有'对象',有的话是否需要' ...

  8. Python网络爬虫 - 一个简单的爬虫例子

    下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request import urlopen f ...

  9. python网页爬虫例子_Python网络爬虫 - 一个简单的爬虫例子

    下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request importurlopenfro ...

最新文章

  1. 机器学习入门(16)— CNN 池化层概念和特征
  2. hdu 1003 Max Sum
  3. ubuntu adb 调试手机
  4. .net pdf转图片_图片转PDF怎么转?推荐两种图片转PDF方法
  5. 华为21级程序员月薪曝光:270k封神!众网友直呼长见识……
  6. 学习笔记-java编程-交通灯管理器设计流程。
  7. 【剑指offer】面试题16:数值的整数次方(Java)
  8. php抓取页面生成html,PHP smiple html dom抓取页面内容
  9. 强连通分量(Tarjan算法)
  10. 深度IP转换器高匿名8级加密企业级专用IP软件
  11. js用blob下载pdf文件打开后中文乱码
  12. 小菜成长记---【proxy 代理模式 ---西门庆干潘金莲——王婆做代理】
  13. css 语音,CSS3新特性一览-- 语音
  14. Intel的ipp库(Integrated Performance Primitives)
  15. SYSTEM_INFO
  16. SVN服务器管理工具——VisualSVN Server Manager
  17. All in 区块链的百度昨日发布了白皮书,说了些什么?
  18. Linux操作系统知识点(上)
  19. 西瓜书入门辅助【机器学习 周志华】一些关于机器学习的重要基础概念提炼
  20. 个人简历模板下载 2020个人简历模板 下载空白简历个人简历

热门文章

  1. 关于R和Python的安全机制
  2. python随机选取列表中的一个字符串_如何从Python中的列表中选择随机字符串?
  3. 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别
  4. 数学建模记录(如何组织,如何参加)(一)
  5. LeetCode 148. Sort List--面试算法题--C++,Python解法
  6. LeetCode 468. Validate IP Address--笔试题--Python解法
  7. 对象是否要被回收(引用计数和可达性分析算法)
  8. java开发编程周末班_今天,Java编程周末提高班(第一期)正式结束
  9. base64是哪个jar包的_如何通过一个类名找到它属于哪个jar包?
  10. pygame简单的俄罗斯方块游戏和简单的打字游戏