带定时器的Windows服务

我用c#.net中的计时器创build了一个windows服务。 它工作正常,而我在Visual Studio中debugging/build立项目,但安装后不执行它的操作。

这背后的原因是什么?

代码:

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"); } } } } 

用Windows Service的第一种方法是不容易的..

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

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

 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()); } } } 

我建议你在一个单独的静态方法(为什么不,在一个控制台应用程序中…只是添加引用)编写真正的服务工作,以简化调试和清理服务代码。

确保间隔足够,并且仅在OnStart和OnStop覆盖中记录日志。

希望这可以帮助!

你需要把你的主要代码放在OnStart方法上。

我的这个答案可能会有所帮助。

您将需要放置一些代码来在Visual Studio中启用调试,同时保持您的应用程序作为Windows服务有效。 这个其他SO线程涵盖了调试Windows服务的问题。

编辑

请参阅MSDN上OnStart方法的可用文档,其中可以阅读:

不要使用构造函数来执行应该在OnStart中的处理 使用OnStart处理您的服务的所有初始化。 构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。 该可执行文件在OnStart之前运行。 例如,当继续时,构造函数不会再被调用,因为SCM已经将对象保存在内存中。 如果OnStop释放在构造函数中而不是在OnStart中分配的资源,则在第二次调用服务时将不会再次创建所需的资源。

下面是一个工作示例,其中服务的执行是在作为ServiceBase类中的委托实现的Timer的OnTimedEvent中启动的,Timer逻辑封装在名为SetupProcessingTimer()的方法中:

 public partial class MyServiceProject: ServiceBase { private Timer _timer; public MyServiceProject() { InitializeComponent(); } private void SetupProcessingTimer() { _timer = new Timer(); _timer.AutoReset = true; double interval = Settings.Default.Interval; _timer.Interval = interval * 60000; _timer.Enabled = true; _timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); } private void OnTimedEvent(object source, ElapsedEventArgs e) { // begin your service work MakeSomething(); } protected override void OnStart(string[] args) { SetupProcessingTimer(); } ... } 

间隔是在几分钟内在app.config中定义的:

 <userSettings> <MyProject.Properties.Settings> <setting name="Interval" serializeAs="String"> <value>1</value> </setting> </MyProject.Properties.Settings> </userSettings>