Windows服务与计时器 [英] Windows service with timer

查看:268
本文介绍了Windows服务与计时器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个窗口服务与定时器C#.NET。它工作得很好,而我调试/建立在Visual Studio中的项目,但安装后不执行它的操作。

什么可能是这背后的原因是什么?

code:

 公共部分类服务1:ServiceBase的
{
        的FileStream FS;
        的StreamWriter m_streamWriter;
        计时器TM =新的Timer();

        公共服务1()
        {
            的InitializeComponent();

            this.ServiceName =timerservice;

            tm.Interval = 2000;
            tm.Tick + =新的EventHandler(PerformOperations);
            tm.Start();

            FS =新的FileStream(@C:\ mcWindowsService.txt,FileMode.OpenOrCreate,FileAccess.Write);

            m_streamWriter =新的StreamWriter(FS);
            m_streamWriter.BaseStream.Seek(0,SeekOrigin.End);
        }

        私人无效PerformOperations(对象SENER,EventArgs的五)
        {
            // StreamWriter的SWR =新的StreamWriter(C:\\ test_from_database.txt,真正的);

            尝试
            {
                OdbcConnection CON =新OdbcConnection(DSN = liquor_data);

                OdbcDataAdapter的ADP =新OdbcDataAdapter的(,CON);

                的DataSet ds为新的DataSet();

                字符串SQL =选择item_group *;
                adp.SelectCommand.CommandText = SQL;

                adp.Fill(DS,item_group);

                的foreach(DataRow的医生在ds.Tables [item_group。行)
                {
                    // swr.Write(DR [组名]的ToString()+\ t \ t+ DateTime.Now.TimeOfDay.ToString()+\ N);

                    //Console.WriteLine(dr["group_name]的ToString()+\ t \ t+ DateTime.Now.TimeOfDay.ToString()+\ N);
                    m_streamWriter.WriteLine(DR [组名]的ToString()+\ t \ t+ DateTime.Now.TimeOfDay.ToString()+\ N);
                }

                m_streamWriter.Flush();
            }

            赶上(例外前)
            {
                // swr.Write(错误:+ ex.Message +\ t \ t+ DateTime.Now.TimeOfDay.ToString()+\ N); }
            }
        }
    }
 

解决方案

与Windows服务至上的做法是不容易的。

很久以前,我写了一个C#的服务。

这是服务类的逻辑(经测试,正常工作):

 命名空间MyServiceApp
{
    公共类为MyService:ServiceBase的
    {
        私人System.Timers.Timer的定时器;

        保护覆盖无效的OnStart(字串[] args)
        {
            this.timer =新System.Timers.Timer的(30000D); // 30000毫秒=30秒
            this.timer.AutoReset = TRUE;
            this.timer.Elapsed + =新System.Timers.ElapsedEventHandler(this.timer_Elapsed);
            this.timer.Start();
        }

        保护覆盖无效的onStop()
        {
            this.timer.Stop();
            this.timer = NULL;
        }

        私人无效timer_Elapsed(对象发件人,System.Timers.ElapsedEventArgs E)
        {
            MyServiceApp.ServiceWork.Main(); //我单独的静态方法做的工作
        }

        公共则将MyService()
        {
            this.ServiceName =为MyService;
        }

        //服务入口点
        静态无效的主要()
        {
            System.ServiceProcess.ServiceBase.Run(新则将MyService());
        }
    }
}
 

我建议你写你的真正的服务工作,在一个单独的静态方法(为什么不呢,在控制台应用程序...只需添加参考吧),以简化调试和清洁服务,code。

确认的时间间隔就足够了,写在日志只有在OnStart中和的onStop覆盖。

希望这有助于!

I have created a windows service with timer in c#.net. it works fine while i debug/build the project in visual studio but it does not perform its operation after installation.

What might be the reason behind this ?

code :

public partial class Service1 : ServiceBase
{
        FileStream fs;
        StreamWriter m_streamWriter;
        Timer tm = new Timer();

        public Service1()
        {
            InitializeComponent();

            this.ServiceName = "timerservice";

            tm.Interval = 2000;
            tm.Tick += new EventHandler(PerformOperations);
            tm.Start();

            fs = new FileStream(@"c:\mcWindowsService.txt", FileMode.OpenOrCreate, FileAccess.Write);

            m_streamWriter = new StreamWriter(fs);
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
        }

        private void PerformOperations(object sener, EventArgs e)
        {
            //StreamWriter swr = new StreamWriter("c:\\test_from_database.txt",true);

            try
            {
                OdbcConnection con = new OdbcConnection("DSN=liquor_data");

                OdbcDataAdapter adp = new OdbcDataAdapter("", con);

                DataSet ds = new DataSet();

                string sql = "select * from item_group";
                adp.SelectCommand.CommandText = sql;

                adp.Fill(ds, "item_group");

                foreach (DataRow dr in ds.Tables["item_group"].Rows)
                {
                    //      swr.Write(dr["group_name"].ToString() + "\t\t" + DateTime.Now.TimeOfDay.ToString() + "\n");

                    //Console.WriteLine(dr["group_name"].ToString() + "\t\t" + DateTime.Now.TimeOfDay.ToString() + "\n");
                    m_streamWriter.WriteLine(dr["group_name"].ToString() + "\t\t" + DateTime.Now.TimeOfDay.ToString() + "\n");
                }

                m_streamWriter.Flush();
            }

            catch (Exception ex)
            {
                // swr.Write("Error :"+ ex.Message + "\t\t" + DateTime.Now.TimeOfDay.ToString() + "\n"); }
            }
        }
    }

解决方案

First approach with Windows Service is not easy..

A long time ago, I wrote a C# service.

This is the logic of the Service class (tested, works fine):

namespace MyServiceApp
{
    public class MyService : ServiceBase
    {
        private System.Timers.Timer timer;

        protected override void OnStart(string[] args)
        {
            this.timer = new System.Timers.Timer(30000D);  // 30000 milliseconds = 30 seconds
            this.timer.AutoReset = true;
            this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
            this.timer.Start();
        }

        protected override void OnStop()
        {
            this.timer.Stop();
            this.timer = null;
        }

        private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            MyServiceApp.ServiceWork.Main(); // my separate static method for do work
        }

        public MyService()
        {
            this.ServiceName = "MyService";
        }

        // service entry point
        static void Main()
        {
            System.ServiceProcess.ServiceBase.Run(new MyService());
        }
    }
}

I recommend you write your real service work in a separate static method (why not, in a console application...just add reference to it), to simplify debugging and clean service code.

Make sure the interval is enough, and write in log ONLY in OnStart and OnStop overrides.

Hope this helps!

这篇关于Windows服务与计时器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆