我创建了一个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
答案 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.Timer
或System.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的“输出”窗口中发布消息。你也会看到任何例外情况。