我用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() + "tt" + DateTime.Now.TimeOfDay.ToString() + "n"); //Console.Writeline(dr["group_name"].ToString() + "tt" + DateTime.Now.TimeOfDay.ToString() + "n"); m_streamWriter.Writeline(dr["group_name"].ToString() + "tt" + DateTime.Now.TimeOfDay.ToString() + "n"); } m_streamWriter.Flush(); } catch (Exception ex) { // swr.Write("Error :"+ ex.Message + "tt" + DateTime.Now.TimeOfDay.ToString() + "n"); } } } }
获取txt文件的标准应用程序(.NET)
如何查看是否对文件或文件夹select“包含可inheritance的权限”?
使用C#研究目录及其子目录中文本的高效search
在禁用wow64redirect之后,“找不到指定的程序”
与本地windows服务进行通信的“正确”方式
通过应用程序解锁一个Win7桌面
可靠地检测到我的另一个应用程序正在运行
为什么winform面板仅在鼠标hover或鼠标点击时更新?
如何更改windows Service环境path
在单线程上调用WaitHandle
用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>
总结以上是内存溢出为你收集整理的带定时器的Windows服务全部内容,希望文章能够帮你解决带定时器的Windows服务所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)