C# 添加Windows服务,定时任务。

Posted 蓝雨冰城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 添加Windows服务,定时任务。相关的知识,希望对你有一定的参考价值。

  源码下载地址:http://files.cnblogs.com/files/lanyubaicl/20160830Windows%E6%9C%8D%E5%8A%A1.zip

 

步骤 一 、 创建服务项目。

 

步骤二 、添加安装程序。

 步骤三 、服务属性设置 【serviceInstaller1】。

 

4.1 添加定时任务

 public partial class SapSyn : ServiceBase
    {
        System.Timers.Timer timer1;  //计时器
        System.Timers.Timer timer2;  //计时器
        System.Timers.Timer timer3;  //计时器
        System.Timers.Timer timer4;  //计时器
        public SapSyn()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            
            timer1 = new System.Timers.Timer();
            timer1.Interval = 8000;  //设置计时器事件间隔执行时间
            timer1.Elapsed += new System.Timers.ElapsedEventHandler(TMStart1_Elapsed);
            timer1.Enabled = true;

            timer2 = new System.Timers.Timer();
            timer2.Interval = 8000;  //设置计时器事件间隔执行时间
            timer2.Elapsed += new System.Timers.ElapsedEventHandler(TMStart2_Elapsed);
            timer2.Enabled = true;

            timer3 = new System.Timers.Timer();
            timer3.Interval = 8000;  //设置计时器事件间隔执行时间
            timer3.Elapsed += new System.Timers.ElapsedEventHandler(TMStart3_Elapsed);
            timer3.Enabled = true;

            timer4 = new System.Timers.Timer();
            timer4.Interval = 8000;  //设置计时器事件间隔执行时间
            timer4.Elapsed += new System.Timers.ElapsedEventHandler(TMStart4_Elapsed);
            timer4.Enabled = true;

        }
 
        protected override void OnStop()  //服务停止执行
        {
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\\\log.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop.");
            }
            this.timer1.Enabled = false;
            this.timer2.Enabled = false;
            this.timer3.Enabled = false;            
            this.timer4.Enabled = false;
        }


        protected override void OnPause()
        {
            //服务暂停执行代码
            base.OnPause();
        }
        protected override void OnContinue()
        {
            //服务恢复执行代码
            base.OnContinue();
        }
        protected override void OnShutdown()
        {
            //系统即将关闭执行代码
            base.OnShutdown();
        }

 
        private void TMStart1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        { 
            //执行SQL语句或其他操作
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\\\" + 1 + "log.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
            }
        }
        private void TMStart2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        { 
            //执行SQL语句或其他操作
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\\\" + 2 + "log.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
            }
        }
        private void TMStart3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        { 
            //执行SQL语句或其他操作
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\\\" + 3 + "log.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
            }
        }

        private void TMStart4_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        { 
            //执行SQL语句或其他操作
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\\\" + 4 + "log.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
            }
        }



    }

4.2 设置服务启动方式为自动启动

    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {       
        public ProjectInstaller()
        {
            InitializeComponent();
            this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
        }
        private void ProjectInstaller_Committed(object sender, InstallEventArgs e)
        {
            //参数为服务的名字
            System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("ServiceSapSyn");
            controller.Start();
        }
        private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
        {

        }
    }

步骤五、脚本配置。

安装服务脚本

%SystemRoot%\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe WindowsServiceTest.exe
Net Start ServiceTest
sc config ServiceTest start= auto

卸载服务脚本

%SystemRoot%\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe /u WindowsServiceTest.exe

5.1  停止或启动服务的代码

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        } 
        public string thispath = Application.StartupPath; 
        public string Propath = ""; 
        private void Form1_Load(object sender, EventArgs e)
        {
            this.Text = "启动服务";
        }

        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
            string StarPath = @"%SystemRoot%\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe " + Propath;


            FileStream fs = new FileStream(thispath + "\\\\Install.bat", FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            try
            {
                sw.WriteLine(StarPath);
                sw.WriteLine("Net Start ServiceTest");
                sw.WriteLine("sc config ServiceTest start= auto");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
            finally
            {
                sw.Close();
                fs.Close();
            }
            System.Diagnostics.Process.Start(thispath + "\\\\Install.bat");
            this.Text = "启动服务:你选择的服务已经启动。";
            Cursor = Cursors.Default;
        }

        /// <summary>
        /// 停止服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            string StarPath = @"%SystemRoot%\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe /u " + Propath;

            FileStream fs = new FileStream(thispath + "\\\\Uninstall.bat", FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            try
            {
                sw.WriteLine(StarPath); 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
            finally
            {
                sw.Close();
                fs.Close();
            }
            System.Diagnostics.Process.Start(thispath + "\\\\Uninstall.bat");
            this.Text = "启动服务:你选择的服务已经卸载。";
            Cursor = Cursors.Default;
        }

      

        private void button3_Click(object sender, EventArgs e)
        {
            ///选择文件框 对象
            OpenFileDialog ofd = new OpenFileDialog();
            //打开时指定默认路径
            ofd.InitialDirectory = @"C:\\Documents and Settings\\Administrator.ICBCOA-6E96E6BE\\桌面";
            //如果用户点击确定
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //将用户选择的文件路径 显示 在文本框中
                textBox1.Text = ofd.FileName;
                Propath = textBox1.Text;
            }
            if (File.Exists(thispath + "\\\\Uninstall.bat"))
            {
                File.Delete(thispath + "\\\\Uninstall.bat");
            }
            File.Create(thispath + "\\\\Uninstall.bat").Close();
            if (File.Exists(thispath + "\\\\Install.bat"))
            {
                File.Delete(thispath + "\\\\Install.bat");
            }
            File.Create(thispath + "\\\\Install.bat").Close();
        }

    

        //读写文本 - 写入数据按钮
        private void buttonWrite_Click(string filePath)
        { 
         
        }


        /// <summary>
        /// 运行CMD命令
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <returns></returns>
        public static string Cmd(string[] cmd)
        {
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.AutoFlush = true;
            for (int i = 0; i < cmd.Length; i++)
            {
                p.StandardInput.WriteLine(cmd[i].ToString());
            }
            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            return strRst;
        }

        /// <summary>
        /// 关闭进程
        /// </summary>
        /// <param name="ProcName">进程名称</param>
        /// <returns></returns>
        public static bool CloseProcess(string ProcName)
        {
            bool result = false;
            System.Collections.ArrayList procList = new System.Collections.ArrayList();
            string tempName = "";
            int begpos;
            int endpos;
            foreach (System.Diagnostics.Process thisProc in System.Diagnostics.Process.GetProcesses())
            {
                tempName = thisProc.ToString();
                begpos = tempName.IndexOf("(") + 1;
                endpos = tempName.IndexOf(")");
                tempName = tempName.Substring(begpos, endpos - begpos);
                procList.Add(tempName);
                if (tempName == ProcName)
                {
                    if (!thisProc.CloseMainWindow())
                        thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程
                    result = true;
                }
            }
            return result;
        }

    }

5.2 Form1.Designer.cs 代码

 

    partial class Form1
    {
        /// <summary>
        /// 必需的设计器变量。 Form1.Designer.cs
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button3 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.button1.Location = new System.Drawing.Point(12, 90);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(134, 60);
            this.button1.TabIndex = 0;
            this.button1.Text = "启动服务";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.button2.Location = new System.Drawing.Point(280, 90);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(134, 60);
            this.button2.TabIndex = 0;
            this.button2.Text = "停止服务";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // textBox1
            // 
            this.textBox1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.textBox1.ForeColor = System.Drawing.Color.Maroon;
            this.textBox1.Location = new System.Drawing.Point(108, 13);
            this.textBox1.Multiline = true;
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(306, 67);
            this.textBox1.TabIndex = 2;
            // 
            // button3
            // 
            this.button3.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            this.button3.ForeColor = System.Drawing.Color.Blue;
            this.button3.Location = new System.Drawing.Point(12, 12);
            this.button3.Name = "button3";
            this.button3.Size = new System.Drawing.Size(90, 68);
            this.button3.TabIndex = 3;
            this.button3.Text = "请选择服务路径";
            this.button3.UseVisualStyleBackColor = true;
            this.button3.Click += new System.EventHandler(this.button3_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(419, 155);
            this.Controls.Add(this.button3);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.Name = "Form1";
            this.Text = "选择服务程序";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Button button3;
    }

 源码下载地址:http://files.cnblogs.com/files/lanyubaicl/20160830Windows%E6%9C%8D%E5%8A%A1.zip

以上是关于C# 添加Windows服务,定时任务。的主要内容,如果未能解决你的问题,请参考以下文章

定时任务-C#线程类 windows服务

windows 服务实现定时任务调度

C# 定时自动执行程序

C#定时执行

如何定时重启windows服务

windows和Linux下定时启动或关闭服务