已安装视窗服务,但无法正常工作
本文关键字:常工作 工作 安装 服务 | 更新日期: 2023-09-27 18:31:48
我创建了一个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());
}
}
上面的代码用于服务文件.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});
}
这是程序.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);
}
}
}
如您所见,我已经编写了代码以在初始化或启动时进行记录......但是没有进行任何记录。
编辑:
定时器代码(时间机器)
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";
}
嘟
你用错了Timer
类 - 线索在它的命名空间中:System.Windows.Forms.Timer
。该计时器仅适用于WinForms应用程序。
相反,您应该切换到使用System.Timers.Timer
System.Threading.Timer
中有一个关于计时器类的一般讨论:
System.Threading.Timer
是一个简单、轻量级的计时器,它使用回调方法,由线程池线程提供服务。不建议将其与 Windows 窗体一起使用,因为它的回调不会在用户界面线程上发生。System.Windows.Forms.Timer
是与 Windows 窗体一起使用的更好选择。对于基于服务器的计时器功能,可以考虑使用System.Timers.Timer
,它会引发事件并具有其他功能。
(我的强调取代了原来)
不要在 Windows 服务中使用 System.Windows.Forms.Timer
,它可能不会在其中引发事件。请参阅 Windows 窗体计时器事件未在 Windows 服务中引发。
在 Windows 服务中使用 System.Timers.Timer
或 System.Threading.Timer
。请参阅 Windows 服务和计时器。
请检查TimeMachine.Enable = True,并设置定时器是否定时。
参考此链接
http://codesimplified.com/2010/12/31/creating-window-service-with-net-vs2008/
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 的"输出"窗口中发布消息。 您也会在那里看到任何例外。