安装了Windows服务但没有工作

时间:2012-04-20 06:19:56

标签: c# .net service windows-services install

我创建了一个Windows服务并为其创建了安装程序。它已安装并启动,但我在其中编写的代码未执行。实际上,当我从服务窗口启动服务时,不会触发OnStart()函数。也不是initializecomponent()和静态void main函数..任何人都可以帮助我

请指导我做错了。

这里有一些代码行。如果你想要更多我所写的内容,请告诉我

public partial class iMArchiveService : ServiceBase
{
    Boolean isArchiving = false;

    public iMArchiveService()
    {
        MyException.CreateLog("iMArchiveService: Inside Constructor. Initializing Component");
        InitializeComponent();
        MyException.CreateLog("iMArchiveService: Component Initialized. Timer is set as: " + TimeMachine.Interval.ToString() + " milliseconds");
    }

    protected void TimeMachine_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        try
        {
            MyException.CreateLog("iMArchiveService: Inside Tick Try. Value of isArchiving variable before condition is: " + isArchiving.ToString());
            if (!isArchiving)
                isArchiving = new iM.OrderArchiving.ArchiveOrderXML().ArchiveOrderService();
            MyException.CreateLog("iMArchiveService: Inside Tick Try. Value of isArchiving variable after condition is: " + isArchiving.ToString());
        }
        catch (Exception ex)
        {
            MyException.CreateLog("iMArchiveService: Inside Tick Catch :(");
        }
    }

    protected override void OnStart(string[] args)
    {
        TimeMachine.Enabled = true;
        MyException.CreateLog("iMArchiveService Started: " + DateTime.Now.ToString());
    }

    protected override void OnStop()
    {
        TimeMachine.Enabled = false;
        MyException.CreateLog("iMArchiveService Stopped: " + DateTime.Now.ToString());
    }

}

上面的代码用于service file.cs

这是我的项目安装程序文件

namespace iM.OrderArchivingService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
        InitializeComponent();
        }
    }
}

这是InitializeComponenet函数 -

private void InitializeComponent()
    {
        this.myServiceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller();
        this.myServiceInstaller = new System.ServiceProcess.ServiceInstaller();
        // 
        // myServiceProcessInstaller
        // 
        this.myServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
        this.myServiceProcessInstaller.Installers.AddRange(new System.Configuration.Install.Installer[] {
        this.myServiceInstaller});
        this.myServiceProcessInstaller.Password = null;
        this.myServiceProcessInstaller.Username = null;
        // 
        // myServiceInstaller
        // 
        this.myServiceInstaller.ServiceName = "iMArchiveService";
        // 
        // ProjectInstaller
        // 
        this.Installers.AddRange(new System.Configuration.Install.Installer[] {
        this.myServiceProcessInstaller});

    }

这是program.cs文件

namespace iM.OrderArchivingService
{
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new iMArchiveService() };
        ServiceBase.Run(ServicesToRun);
    }
}
}

正如你所知,我在初始化或启动时编写了要记录的代码..但是没有记录日志。

编辑:

计时器代码(TimeMachine)

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.TimeMachine = new System.Timers.Timer(3600000);
        // 
        // TimeMachine
        // 
        this.TimeMachine.Interval = 3600000;
        this.TimeMachine.Elapsed += new System.Timers.ElapsedEventHandler(TimeMachine_Elapsed);
        // 
        // iMArchiveService
        // 
        this.ServiceName = "iMArchiveService";

    }

日Thnx

4 个答案:

答案 0 :(得分:1)

你使用了错误的Timer类 - 线索在其命名空间中:System.Windows.Forms.Timer。该计时器仅适用于WinForms应用程序。

相反,您应该切换到使用System.Timers.Timer


System.Threading.Timer中对计时器类进行了一般性讨论:

  

System.Threading.Timer是一个简单,轻量级的计时器,它使用回调方法并由线程池线程提供服务。不建议将其与Windows窗体一起使用,因为它的回调不会发生在用户界面线程上。与{strong> Windows窗体一起使用时,System.Windows.Forms.Timer是更好的选择。对于基于服务器的计时器功能,您可以考虑使用System.Timers.Timer,它会引发事件并具有其他功能。

(我的重点取代了原创)

答案 1 :(得分:1)

不要在Windows服务中使用System.Windows.Forms.Timer,它可能不会在其中引发事件。见The Windows Forms Timer event is not raised in a Windows service

在Windows服务中使用System.Timers.TimerSystem.Threading.Timer。请参阅Windows service and timer

答案 2 :(得分:0)

请检查TimeMachine.Enable = True,是否设置了计时器的计时。

参考此链接

http://codesimplified.com/2010/12/31/creating-window-service-with-net-vs2008/

答案 3 :(得分:0)

也许您应该使用Timer.Start()和Timer.Stop()方法来启动和停止计时器,以防万一使用Enabled属性时出现问题。

间隔期为3,600,000,即3600秒或60分钟= 1小时。直到一个小时过去,什么都不会发生;这是你的意图吗?

顺便说一句,设置如下例子的间隔将使您的代码更容易阅读:

this.TimeMachine.Interval = 1 * 1000;  // 1 Second
this.TimeMachine.Interval = 60 * 1000; // 60 Seconds
this.TimeMachine.Interval = 60 * 60 * 1000; // 1 hour

尝试使用System.Diagnostics中的Debug.Writeline()方法。默认情况下,它将在MSVS的“输出”窗口中发布消息。你也会看到任何例外情况。