C#Windows服务:该服务没有响应开始

这是我第一次尝试创建一个调用多个线程的Windows服务。 我做的是创建一个控制台应用程序,然后添加一个Windows服务和安装程序。 我的代码如下。

partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { System.Timers.Timer timer1 = new System.Timers.Timer(); timer1.Interval = 10000; timer1.Start(); timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed); } public static void timer1_Elapsed(object sender, EventArgs e) { Program.ThreadController(); } protected override void OnStop() { // TODO: Add code here to perform any tear-down necessary to stop your service. } } class Program { static void Main(string[] args) { ThreadController(); } public static void ThreadController() { for (int i = 0; i  { processEventLogTesting(); }); } } public static void processEventLogTesting() { EventLog.WriteEntry("ProcessThread1", "Process1 Works"); } } 

我不知道为什么我会收到这个错误,任何提示都会很棒。

谢谢。

首先,我添加了一些调试function。 它实际上很容易(当你知道如何!!!)。

将此添加到您的class级:

 [DllImport("kernel32.dll")] public static extern Int32 AllocConsole(); 

然后将其添加到您的main函数中(如果您启用服务以便按顺序访问用户界面,那么当您作为服务运行时也可以这样做)。

 for (int loop = 0; loop < args.Count; loop++) { if (args[loop] == "debug") AllocConsole(); } 

这为您提供了一个控制台窗口,您可以使用Console.WriteLine立即向其发送输出。 好吃。

现在你想要实现的是服务控制管理器调用你的OnStart方法,然后该方法必须返回OK信号让SCM知道你的应用程序启动正常。 否则,SCM认为出了问题并杀死了你的应用。 所以OnStart应该启动你的线程。 因此,创建一个由您的线程(和Main)运行的Run()方法,并使OnStart尽可能快地返回。

我注意到你在代码示例中没有看到任何这个:

System.ServiceProcess.ServiceBase [] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase [] {new WinService1()}; System.ServiceProcess.ServiceBase.Run(ServicesToRun);

我怀疑您的应用程序没有向SCM报告它已成功启动可执行文件中的“服务”。

您希望您的应用程序启动,将“服务”交给SCM并让它知道您没问题,然后返回,而您的服务现在正在使用自己的线程运行。

请参阅此文章,了解更多信息: http : //msdn.microsoft.com/en-us/library/aa984464(v = vs.71).aspx

您在processEventLogTesting ()有无限递归。 这就是它没有回应的原因。 当我使用计时器编写Windows服务时,我所做的就是连接回调并在OnStart中启动计时器。 然后我坐下来让它做它的事情。 你试图在启动时做太多。

  partial class Service1 : ServiceBase { private Program program; public Service1() { InitializeComponent(); program = new Program (); } protected override void OnStart(string[] args) { program.Start (); } protected override void OnStop() { program.Stop (); } } class Program { private Systems.Timers.Timer timer; public Program () { timer = new System.Timers.Timer (); timer.Interval = 10000; timer.Elapsed += new ElapsedEventHandler (timer_Elapsed); } public void Start () { timer.Enabled = true; } public void Stop () { timer.Enabled = false; } public static void timer_Elapsed (object sender, EventArgs e) { EventLog.WriteEntry ("ProcessThread1", "Process1 Works"); } } 
  1. 您没有在代码中启动线程,因此:

     for (int i = 0; i < 3; i++) { new Thread(() => { processEventLogTesting(); }) { IsBackground = true }.Start(); } 
  2. 在您的processEventLogTesting()中,除了错误的递归调用之外,您还要创建一个计时器,然后通过timer1 = new System.Timers.Timer();覆盖它timer1 = new System.Timers.Timer(); 所以它不会开火。

     public static void processEventLogTesting() { System.Timers.Timer timer1 = new System.Timers.Timer(); timer1.Interval = 10000; timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed); timer1.Start(); } 

众所周知,Windows服务很难调试。 如果您没有收到任何其他消息,请尝试在onstart上暂停,您应该能够附加到它,然后查看问题所在。

Nik在这里有答案,但这可能对其他Windows服务有用!