我已经在c#.net中使用计时器创建了Windows服务。当我在Visual Studio中调试/构建项目时,它工作正常,但安装后不执行其操作。
这可能是什么原因?
代码:
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#服务。
这是Service类的逻辑(经过测试,可以正常工作):
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替代中写入日志。
希望这可以帮助!