Topshelf是建立Windows服務的另外一種方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf經過5個步驟詳細的介紹使用使用Topshelf建立Windows 服務。Topshelf是一個開源的跨平臺的宿主服務框架,支持Windows和Mono,只須要幾行代碼就能夠構建一個很方便使用的服務宿主。windows
1 public class TownCrier 2 { 3 private readonly Timer timer; 4 public TownCrier() 5 { 6 timer = new Timer(1000) { AutoReset = true }; 7 timer.Elapsed += (sender,eventArgs) => Console.WriteLine($"It is {DateTime.Now} and all is well"); 8 } 9 public void Start() 10 { 11 timer.Start(); 12 } 13 public void Stop() 14 { 15 timer.Stop(); 16 } 17 18 } 19 20 static void Main(string[] args) 21 { 22 HostFactory.Run(x => 23 { 24 x.Service<TownCrier>(s => 25 { 26 s.ConstructUsing(name => new TownCrier()); 27 s.WhenStarted(tc => tc.Start()); 28 s.WhenStopped(tc => tc.Stop()); 29 }); 30 x.RunAsLocalSystem(); 31 x.SetDescription("QuartzNet任務調度服務,靈活配置任務計劃"); 32 x.SetDisplayName("QuartzJobShedule"); 33 x.SetServiceName("Quartz任務調度框架"); 34 } 35 ); 36 }
在項目的開發過程當中,不免會碰見後須要後臺處理的任務,例如定時發送郵件通知、後臺處理耗時的數據處理等,這個時候能夠使用Quartz.Net。負載均衡
Quartz.Net是純淨的,它是一個.Net程序集,是很是流行的Java做業調度系統Quartz的C#實現。框架
Quartz.Net是一款功能齊全的任務調度系統,從小型應用到大型企業級系統都能適用。功能齊全體如今觸發器的多樣性上面,即支持簡單的定時器,也支持Cron表達式;即能執行重複的做業任務,也支持指定例外的日曆;任務也能夠是多樣性的,只要繼承IJob接口便可。async
對於小型應用,能夠集成到你的系統中,對於企業級系統,它提供了Routing支持,提供了Group來組織和管理任務,此外還有持久化、插件功能、負載均衡和故障遷移等知足不一樣應用場景的須要。ui
1 /// <summary> 2 /// 繼承IJob的一個任務 3 /// </summary> 4 public class HelloQuartzJob : IJob 5 { 6 public Task Execute(IJobExecutionContext context) 7 { 8 return Task.Factory.StartNew(() => 9 { 10 Console.WriteLine("Hello Quartz.Net"); 11 }); 12 } 13 }
1 static async Task Main(string[] args) 2 { 3 //從工廠中獲取調度器實例 4 var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); 5 6 //建立做業和觸發器 7 var jobDetail = JobBuilder.Create<HelloQuartzJob>().Build(); 8 var trigger = TriggerBuilder.Create() 9 .WithSimpleSchedule(m => 10 { 11 m.WithRepeatCount(10).WithIntervalInSeconds(1); 12 }) 13 .Build(); 14 15 Console.WriteLine($"任務調度器已啓動"); 16 17 //添加調度 18 await scheduler.ScheduleJob(jobDetail, trigger); 19 20 await scheduler.Start(); 21 Console.ReadKey(); 22 }
1 public class JobConfigure 2 { 3 private IScheduler scheduler; 4 5 public async Task GetJobConfigure() 6 { 7 //從工廠中獲取調度器實例 8 scheduler = await StdSchedulerFactory.GetDefaultScheduler(); 9 //建立做業和觸發器 10 var jobDetail = JobBuilder.Create<HelloQuartzJob>().Build(); 11 var trigger = TriggerBuilder.Create().WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForever(1).WithRepeatCount(10)) 12 .Build(); 13 //添加調度 14 await scheduler.ScheduleJob(jobDetail, trigger); 15 } 16 17 public void Start() 18 { 19 this.GetJobConfigure().Wait(); 20 scheduler.Start(); 21 } 22 public void Stop() 23 { 24 scheduler.Shutdown(true); 25 } 26 27 }
1 static void Main(string[] args) 2 { 3 HostFactory.Run(x => 4 { 5 x.Service<JobConfigure>(s => 6 { 7 s.ConstructUsing(name => new JobConfigure()); 8 s.WhenStarted(tc => tc.Start()); 9 s.WhenStopped(tc => tc.Stop()); 10 }); 11 x.RunAsLocalSystem(); 12 x.SetDescription("QuartzNet任務調度服務,靈活配置任務計劃"); 13 x.SetDisplayName("QuartzJobShedule"); 14 x.SetServiceName("Quartz任務調度框架"); 15 } 16 ); 17 }