咱們一般在一些狀況下須要軟件具備一個自動執行某些任務的功能,可是又不但願直接啓動軟件,或者每次都要手動的來啓動軟件,這時咱們可能夠考慮到windows服務了。html
首先建立一個windows服務項目(詳細信息請參閱:C#建立Windows Service(Windows 服務)基礎教程)windows
在建立好的項目中點擊「單擊此處切換到代碼視圖」切換到代碼網絡
咱們主要關注一下兩個方法:框架
• OnStart – 控制服務啓動
• OnStop – 控制服務中止ide
例:post
1 public partial class Service1 : ServiceBase 2 { 3 public Service1() 4 { 5 InitializeComponent(); 6 } 7 8 protected override void OnStart(string[] args) 9 { 10 //todo:這裏是服務啓動所執行的代碼 11 } 12 13 protected override void OnStop() 14 { 15 //todo:這裏是服務中止所執行的代碼 16 } 17 }
下面咱們能夠寫一個定時任務的功能了:網站
1 private void StartDoSomething() 2 { 3 System.Timers.Timer timer = new System.Timers.Timer(10000); //間隔10秒 4 timer.AutoReset = true; 5 timer.Enabled = false; //執行一次 6 timer.Elapsed += new ElapsedEventHandler(ExecutionCode); 7 timer.Start(); 8 } 9 10 private void ExecutionCode(object source, System.Timers.ElapsedEventArgs e) 11 { 12 string dtNow = DateTime.Now.ToString("HH:mm"); 13 if (dtNow == "12:00") 14 { 15 File.WriteAllText("D:/ExecutionService.txt", "服務執行了一次任務", Encoding.UTF8); 16 } 17 }
而後在OnStart的方法中調用上面的StartDoSomething的方法ui
1 protected override void OnStart(string[] args) 2 { 3 StartDoSomething(); 4 }
以上就能夠算是一個簡單的定時執行任務的windows服務了,這裏咱們還可使用Quartz.Net來實現更增強大的任務調度功能。url
首先來介紹一下Quartz.Net這個框架:spa
簡介:Quartz.Net是一個開源的任務調度框架,很是強大,可以經過簡單的配置幫助咱們定時具體的操做。相對於咱們用的線程裏面while(true)而後sleep來執行某個操做,應該算的上是高端,大氣,上檔次了。目前最新版本是2.2,新的版本里面有些方法名發生了變化,從以前的版本用過來的人應該會有體會.這裏我使用最經常使用,也是最穩定的方式--Windows服務裏面使用Quartz.net,而且使用配置的方式來設置觸發器。(以上內容摘自網絡)
簡單的理解就是它可以幫咱們定時的作事,至關於鬧鐘可以叫咱們起牀同樣。
目前最新的版本是Quartz.NET 2.2.3 你們能夠在這裏下載
如今咱們須要在剛剛建立的服務項目中引用以下文件:
在配置文件中寫好本身的配置(本例子演示定時訪問指定網站)
1 <?xml version="1.0"?> 2 <configuration> 3 <configSections> 4 <sectionGroup name="JobList"> 5 <section name="Job" type="MyService1101.MyConfigHandler,MyService1101"/> 6 </sectionGroup> 7 </configSections> 8 <startup> 9 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 10 </startup> 11 <JobList> 12 <Job> <!--這裏是一個任務節點--> 13 <add key="Url" value="http://www.baidu.com" /> <!--須要訪問的Url--> 14 <add key="Hour" value="10" /> <!--開始時間小時,注意:這裏的小時爲0-23,若是是1點的話就是1,而不是01--> 15 <add key="Minute" value="30"/> <!--開始時間分鐘,注意:同上0-59--> 16 </Job> 17 </JobList> 18 </configuration>
新建一個MyConfigHandler.cs類來讀取自定義配置節點
1 public class MyConfigHandler : IConfigurationSectionHandler 2 { 3 public MyConfigHandler() 4 { 5 } 6 7 public object Create(object parent, object configContext, System.Xml.XmlNode section) 8 { 9 NameValueCollection configs; 10 NameValueSectionHandler baseHandler = new NameValueSectionHandler(); 11 configs = (NameValueCollection)baseHandler.Create(parent, configContext, section); 12 return configs; 13 } 14 }
而後新建一個SystemScheduler類來建立調度程序
1 public class SystemScheduler 2 { 3 private SystemScheduler() 4 { 5 } 6 7 public static SystemScheduler CreateInstance() 8 { 9 return new SystemScheduler(); 10 } 11 12 private IScheduler _scheduler; 13 14 public void StartScheduler() 15 { 16 //這裏讀取配置文件中的任務開始時間 17 int hour = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Hour"]); 18 int minute = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Minute"]); 19 20 ISchedulerFactory schedulerFactory = new StdSchedulerFactory();//內存調度 21 _scheduler = schedulerFactory.GetScheduler(); 22 23 //建立一個Job來執行特定的任務 24 IJobDetail synchronousData = new JobDetailImpl("SynchronousData", typeof(SynchronousData)); 25 //建立並定義觸發器的規則(天天執行一次時間爲:時:分) 26 ITrigger trigger = 27 TriggerBuilder.Create() 28 .WithDailyTimeIntervalSchedule( 29 a => a.WithIntervalInHours(24).OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(hour, minute))).Build(); 30 //將建立好的任務和觸發規則加入到Quartz中 31 _scheduler.ScheduleJob(synchronousData, trigger); 32 //開始 33 _scheduler.Start(); 34 } 35 36 public void StopScheduler() 37 { 38 _scheduler.Shutdown(); 39 } 40 }
新建一個SynchronousData類,讓其實現IJob接口來實現SystemScheduler中自定義的任務
1 public class SynchronousData : IJob 2 { 3 public void Execute(IJobExecutionContext context) 4 { 5 string Url = ((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Url"]; 6 WebClient wc = new WebClient(); 7 WebRequest wr = WebRequest.Create(new Uri(Url)); 8 using (StreamWriter sw = File.AppendText(@"d:\SchedulerService.txt")) 9 { 10 sw.WriteLine("------------------" + "MyService服務在:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 執行了一次任務" + "------------------"); 11 sw.Flush(); 12 } 13 } 14 }
最後在OnStart中添加對這個調度程序的應用
1 protected override void OnStart(string[] args) 2 { 3 SystemScheduler _systemScheduler = SystemScheduler.CreateInstance(); 4 _systemScheduler.StartScheduler(); 5 }
程序生成後咱們能夠經過指令安裝它
安裝完成後在服務中會有一個新的服務項
程序運行事後會在D:盤生成一個SchedulerService.txt文件
本程序源碼:下載