Windows服务在指定时间运行一个函数我想在每天的特定时间启动一个Windows服务来运行一个函数。我应该考虑采用什么方法来实现这一目标?定时器还是使用线程?(1)第一次启动时,设置_timer.Interval为服务启动到调度时间的毫秒数。此示例设置的时间表是早上7:00,因为_scheduleTime=DateTime.Today.AddDays(1).AddHours(7);(2)在Timer_Elapsed上,如果当前间隔不是24小时,则设置_timer.IntervalReset为24小时(以毫秒为单位)。System.Timers.Timer_timer;日期时间_scheduleTime;publicWinService(){InitializeComponent();_timer=newSystem.Timers.Timer();_scheduleTime=DateTime.Today.AddDays(1).AddHours(7);//计划每天早上7:00运行一次}protectedoverridevoidOnStart(string[]args){//对于第一次,设置当前时间和计划时间之间的秒数_timer.Enabled=true;_timer.Interval=_scheduleTime.Subtract(DateTime.Now).TotalSeconds*1000;_timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(Timer_Elapsed);}protectedvoidTimer_Elapsed(objectsender,System.Timers.ElapsedEventArgse){//1.进程调度任务//----------------------------------//在此处添加代码以处理您的任务//---------------------------------//2.如果第一次勾选,将下次运行重置为每24小时一次if(_timer.Interval!=24*60*60*1000){_timer.Interval=24*60*60*1000;编辑:有时人们希望安排服务在第0天而不是明天开始,因此他们更改DateTime。Today.AddDays(0)如果他们这样做并设置过去的时间,将Interval设置为负数,则会导致错误。//测试它是否是过去的时间,并保护设置_timer.Interval为负数,这会导致错误。双tillNextInterval=_scheduleTime.Subtract(DateTime.Now).TotalSeconds*1000;if(tillNextInterval很好的答案(我用过你的代码),但是这一行有问题:_timer.Interval=_scheduleTime.Subtract(DateTime.Now).TotalSeconds*1000;如果DateTime.now晚于scheduleTime,你将成为负数,会赋给timer.Interval时产生异常,我用的是:if(DateTime.now>scheduleTime)scheduleTime=scheduleTime.AddHours(24);然后做减法,用Windows自带的TaskScheduler(http://windows.microsoft.com/en-us/windows7/schedule-a-task)或Quartz.net。除非...您有一项服务正在进行大量其他处理并且需要一直运行,在这种情况下Timer可能是合适的。您确定需要每天只运行一次的服务吗?也许WindowsTaskScheduler会是更好的解决方案?私人静态双预定时间=10;私有静态DateTimescheduledTime;publicWinService(){scheduledTime=DateTime.Today.AddHours(scheduledHour);//将今天上午10点设置为预定时间服务开始日期}privatevoidtimer_Elapsed(objectsentSystem.Timers.ElapsedEventArgse){DateTimenow=DateTime.现在;if(scheduledTime你可以用线程和事件来做;不需要定时器。以上就是C#学习教程的全部内容:Windows服务定时运行函数。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---usingSystem;使用System.ServiceProcess;使用系统线程;部分类服务:ServiceBase{ThreadThread;只读AutoResetEventStopEvent;公共服务(){InitializeComponent();StopEvent=newAutoResetEvent(initialState:false);}protectedoverridevoidDispose(booldisposing){if(disposing){StopEvent.Dispose();组件?.Dispose();}base.Dispose(处理);}protectedoverridevoidOnStart(string[]args){Thread=newThread(ThreadStart);Thread.Start(TimeSpan.Parse(args[0]));}protectedoverridevoidOnStop(){if(!StopEvent.Set())Environment.FailFast("设置停止事件失败");线程.加入();}voidThreadStart(objectparameter){while(!StopEvent.WaitOne(Timeout(timeOfDay:(TimeSpan)parameter))){//在这里工作...}}staticTimeSpanTimeout(TimeSpantimeOfDay){vartimeout=timeOfDay-日期时间.Now.TimeOfDay;如果(超时本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
