2010-05-12 48 views
3

我有一个奇怪的问题,我没有见过,我认为它必须是简单的东西,我没有在我的代码中看到。单个项目中的多个窗口服务=神秘

我有一个定义了2个窗口服务的项目。一个我叫DataSyncService,另一个SubscriptionService。两者都被添加到相同的项目安装程序。两者都使用System.Timers中的计时器控件。

如果我一起启动两项服务,它们似乎工作正常。定时器在适当的时间流逝,一切看起来都不错。但是,如果我单独启动其中一项服务,而另一项服务停止,则一切都会失控。定时器不断流逝,并在错误的服务。换句话说,如果我启动DataSyncService,SubscriptionService计时器会一遍又一遍地流逝。这显然很奇怪。

该设置与我在过去所做的类似,所以我真的难倒了。我甚至尝试删除这两个服务并重新开始,但它似乎没有什么区别。在这一点上,我认为我在定义服务的方式上犯了一个简单的错误,而我的大脑不会让我看到它。它必须创建某种线程问题,导致一个服务在另一个服务停止时竞争。下面的代码....

从Program.cs的:

static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new DataSyncService(), 
      new SubscriptionService() 

     }; 
     ServiceBase.Run(ServicesToRun); 
    } 

从ProjectInstaller.designer.cs:

private void InitializeComponent() 
    { 
     this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); 
     this.dataSyncInstaller = new System.ServiceProcess.ServiceInstaller(); 
     this.subscriptionInstaller = new System.ServiceProcess.ServiceInstaller(); 
     // 
     // serviceProcessInstaller1 
     // 
     this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; 
     this.serviceProcessInstaller1.Password = null; 
     this.serviceProcessInstaller1.Username = null; 
     // 
     // dataSyncInstaller 
     // 
     this.dataSyncInstaller.DisplayName = "Data Sync Service"; 
     this.dataSyncInstaller.ServiceName = "DataSyncService"; 
     this.dataSyncInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic; 
     // 
     // subscriptionInstaller 
     // 
     this.subscriptionInstaller.DisplayName = "Subscription Service"; 
     this.subscriptionInstaller.ServiceName = "SubscriptionService"; 
     this.subscriptionInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic; 
     // 
     // ProjectInstaller 
     // 
     this.Installers.AddRange(new System.Configuration.Install.Installer[] { 
     this.serviceProcessInstaller1, 
     this.dataSyncInstaller, 
     this.subscriptionInstaller}); 

    } 

private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1; 
    private System.ServiceProcess.ServiceInstaller dataSyncInstaller; 
    private System.ServiceProcess.ServiceInstaller subscriptionInstaller; 

从DataSyncService.cs:

public static readonly int _defaultInterval = 43200000; 
    //log4net.ILog log; 

    public DataSyncService() 
    { 
     InitializeComponent(); 

     //log = LogFactory.Instance.GetLogger(this); 
    } 

    protected override void OnStart(string[] args) 
    { 
     timer1.Interval = _defaultInterval; //GetInterval(); 
     timer1.Enabled = true; 
     EventLog.WriteEntry("MyProj", "Data Sync Service Started", EventLogEntryType.Information); 
     //log.Info("Data Sync Service Started"); 
    } 

    private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     EventLog.WriteEntry("MyProj", "Data Sync Timer Elapsed.", EventLogEntryType.Information); 

    } 

private void InitializeComponent() 
    { 
     this.timer1 = new System.Timers.Timer(); 
     ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit(); 
     // 
     // timer1 
     // 
     this.timer1.Enabled = true; 
     this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed); 
     // 
     // DataSyncService 
     // 
     this.ServiceName = "DataSyncService"; 
     ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit(); 

    } 

从SubscriptionService:

public static readonly int _defaultInterval = 300000; 
    //log4net.ILog log; 

    public SubscriptionService() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     timer1.Interval = _defaultInterval; //GetInterval(); 
     timer1.Enabled = true; 
     EventLog.WriteEntry("MyProj", "Subscription Service Started", EventLogEntryType.Information); 
     //log.Info("Subscription Service Started"); 
    } 

    private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     EventLog.WriteEntry("MyProj", "Subscription Service Time Elapsed", EventLogEntryType.Information); 
    } 

private void InitializeComponent() //in designer 
    { 
     this.timer1 = new System.Timers.Timer(); 
     ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit(); 
     // 
     // timer1 
     // 
     this.timer1.Enabled = true; 
     this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed); 
     // 
     // SubscriptionService 
     // 
     this.ServiceName = "SubscriptionService"; 
     ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit(); 

    } 

同样,问题是timer1_elapsed处理程序在只有其中一个服务启动时持续运行。它是OPPOSITE服务的处理程序。

有人看到什么吗?

+0

什么Program.cs中做什么?我的意思是,我可以看到它启动了两项服务,但它何时运行? – SqlRyan 2010-05-12 15:31:46

+0

当你向这个世界释放这样的东西时,这个答案只会让你尴尬,这不是太神奇了吗?在Service.Designer.cs文件的InitializeComponent()方法中,我很缺少 this.CanShutdown = true; ...我不应该启用计时器,因为我在OnStart处理程序中执行它。 噢,最终其他人会有同样的问题,希望他们会找到这个。 – Remoh 2010-05-12 15:32:55

回答

3

在Service.Designer.cs文件的InitializeComponent()方法,我很想念

this.CanShutdown = true; 

...我不应该有使计时器,因为我在的OnStart处理程序做到这一点。

因此,它应该是这样的:

private void InitializeComponent() 
{ 
    this.timer1 = new System.Timers.Timer(); 
    ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit(); 
    // 
    // timer1 
    // 

    this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed); 
    // 
    // DataSyncService 
    // 
    this.ServiceName = "DataSyncService"; 
    this.CanShutdown = true; 
    ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit(); 

}