1

我创建了一个 Windows 服务并为其创建了安装程序。它已安装并启动,但我在其中编写的代码没有执行。实际上,当我从服务窗口启动服务时,不会触发 OnStart() 函数。也不是 initializecomponent() 也不是 static 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());
    }

}

上面的代码用于服务 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";

    }

谢谢

4

4 回答 4

1

不要System.Windows.Forms.Timer在 Windows 服务中使用,它可能不会在其中引发事件。请参阅Windows 服务中未引发 Windows 窗体计时器事件

在 Windows 服务中使用System.Timers.Timer或使用。System.Threading.Timer请参阅Windows 服务和计时器

于 2012-04-20T07:23:12.147 回答
1

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

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


有一个定时器类的一般讨论System.Threading.Timer

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

(我的重点取代了原来的)

于 2012-04-20T07:19:17.103 回答
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 的输出窗口中发布消息。您还会在那里看到任何异常。

于 2012-04-20T07:38:45.457 回答
0

请检查 TimeMachine.Enable = True 并设置计时器的计时。

参考这个链接

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

于 2012-04-20T06:45:40.443 回答