2014-07-08 86 views
0

我有這樣的窗口服務項目,該項目是OnStart方法看起來像這樣石英作業計劃程序在Windows服務

protect void OnStart(string[] args) 
{ 
    IScheduler someScheduler = _schedFactory.GetScheduler(); // _schedFactory is a priva field of the service class 

    IJobDetail someJob = JobBuilder.Create<SomeJob>() 
     .WithIdentity("SomeJob") 
     .Build(); 

    ITrigger someTrigger = TriggerBuilder.Create() 
     .StartAt(new DateTimeOffset(DateTime.UtcNow.AddSeconds(30))) 
     .WithSimpleSchedule(schedule => scheduler.WithIntervalInMinutes(3).RepeatForever()) 
     .Build(); 

    someScheduler.SchedulerJob(someJob, someTrigger); 

    someScheduler.Start(); 
} 

我使用Visual Studio開發人員命令提示符來安裝服務。該命令是installutil.exe。現在當服務安裝時,我去任務管理器並啓動它。在OnStart方法的頂部有Thread.Sleep(10000),所以我可以設法通過調試器附加到服務。所以當它連接時,我會通過代碼,沒有什麼特別的事情發生,我的意思是沒有異常發生。我甚至看到了工作應該執行的時間和正確的時間。當我坐在調試模式並等待作業的Execute方法執行時,它不會。我的意思是當視覺工作室正在加載符號時,但作業本身不會被執行。可能是什麼問題?還有一件事是我在這個OnStart方法中創建兩個工作。該代碼是相同的。它能成爲問題的原因嗎?有時第二份工作有時候不會執行。我的意思是如果它每3分鐘執行一次就執行一次,但如果它在第一個預定時間沒有執行,它就不會執行。

回答

2

您的代碼存在的問題是OnStart完成運行後,調度程序的引用超出範圍。 SomeScheduler應該定義在函數之外的某個地方,以便它不會被垃圾收集。作爲一個例子,Quartz.Net服務器項目是這樣做的(使用Topshelf,但我認爲你有這個想法,這是安裝該服務的主要程序,注意它返回一個對服務器的引用,所以主機可以保留。對它的引用

public static class Program 
{ 
    /// <summary> 
    /// Main. 
    /// </summary> 
    public static void Main() 
    { 
     HostFactory.Run(x => 
          { 
           x.RunAsLocalSystem(); 

           x.SetDescription(Configuration.ServiceDescription); 
           x.SetDisplayName(Configuration.ServiceDisplayName); 
           x.SetServiceName(Configuration.ServiceName); 

           x.Service(factory => 
               { 
                QuartzServer server = new QuartzServer(); 
                server.Initialize(); 
                return server; 
               }); 
          }); 
    } 
} 

在QuartzServer類調度是一個實例變量:

public class QuartzServer : ServiceControl, IQuartzServer 
{ 
    private readonly ILog logger; 
    private ISchedulerFactory schedulerFactory; 
    private IScheduler scheduler; // code snipped.... 

} 

由於@granadaCoder指出,這可能是更容易簡單地重新使用提供服務器。

以下是鏈接到QuartzServerProgram.cs