Windows服务不断运行

我创build了一个名为ProxyMonitor的Windows服务,并且当前处于服务安装和卸载阶段,我希望它。

所以我执行这样的应用程序:

C:\\Windows\\Vendor\\ProxyMonitor.exe /install 

漂亮的自我解释,然后我得到services.msc和启动服务,但是当我这样做时,我得到以下消息:

本地计算机上的代理监视器服务已启动,然后停止。 如果没有工作要做,某些服务会自动停止,例如性能日志和警报服务

我的代码如下所示:

 public static Main(string[] Args) { if (System.Environment.UserInteractive) { /* * Here I have my install logic */ } else { ServiceBase.Run(new ProxyMonitor()); } } 

然后在ProxyMonitor类中我有:

 public ProxyMonitor() { } protected override void OnStart(string[] args) { base.OnStart(args); ProxyEventLog.WriteEntry("ProxyMonitor Started"); running = true; while (running) { //Execution Loop } } 

onStop()我只是将runningvariables更改为false ;

我需要做些什么来使服务不断活跃,因为我需要监视我需要跟踪更改的networking。


更新:1

 protected override void OnStart(string[] args) { base.OnStart(args); ProxyEventLog.WriteEntry("ProxyMonitor Started"); Thread = new Thread(ThreadWorker); Thread.Start(); } 

ThreadWorker我有ProxyEventLogger.WriteEntry("Main thread entered")不会被解雇。

OnStart()callback需要及时返回,所以你需要启动一个线程来执行所有的工作。 我会build议将以下字段添加到您的类中:

 using System.Threading; private ManualResetEvent _shutdownEvent = new ManualResetEvent(false); private Thread _thread; 

_thread字段将保存对OnStart()callback中创build的System.Threading.Thread对象的引用。 _shutdownEvent字段包含一个系统级别的事件结构,用于指示线程在服务closures时停止运行。

OnStart()callback中,创build并启动您的线程。

 protected override void OnStart(string[] args) { _thread = new Thread(WorkerThreadFunc); _thread.Name = "My Worker Thread"; _thread.IsBackground = true; _thread.Start(); } 

你需要一个名为WorkerThreadFunc的函数才能工作。 它必须匹配System.Threading.ThreadStart委托签名。

 private void WorkerThreadFunc() { } 

如果你没有在这个函数中添加任何东西,线程将会启动,然后立即closures,所以你必须在那里放置一些逻辑,这样在你做工作的时候基本上可以让线程继续运行。 这是_shutdownEvent派上用场的地方。

 private void WorkerThreadFunc() { while (!_shutdownEvent.WaitOne(0)) { // Replace the Sleep() call with the work you need to do Thread.Sleep(1000); } } 

while循环检查ManualResetEvent是否“设置”。 由于我们用上面的false初始化了对象,所以这个检查返回false。 在循环内,我们睡了1秒。 您需要将其replace为您需要执行的工作 – 监视代理设置等

最后,在您的Windows服务的OnStop()callback中,您要通知该线程停止运行。 这很容易使用_shutdownEvent

 protected override void OnStop() { _shutdownEvent.Set(); if (!_thread.Join(3000)) { // give the thread 3 seconds to stop _thread.Abort(); } } 

希望这可以帮助。

您需要退出您的OnStart处理程序,以便服务控制器意识到您的服务已经启动。 为了使它像你想要的那样工作,你可以启动一个计时器,它会以一定的时间间隔进行打点,并在打勾时进行处理。

编辑:

尝试在您的OnStart放置一个System.Diagnostics.Debugger.Launch()来查看发生了什么(并在ThreadWorker放置一个断点)。 我build议在#if DEBUG包装这个以确保它不被部署。

我也意识到你不会给你的Thread一个名字:

  Thread myThread = new Thread(ThreadWorker); myThread.Start(); 

当然不是在OnStart方法中添加一个while循环。 这会告诉操作系统该服务没有启动,因为它不能安全地从OnStart方法中退出。 我通常创build一个在OnStart方法中启用的Timer 。 然后在Ticks方法中,我确实调用了必要的方法来获得应用程序的运行。

或者,您可以执行以下操作:

 // The main entry point for the process static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new WinService1() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); } 

有关Windows服务的更多信息,可以在这里获得一个框架示例。

示例代码演示使用控制台应用程序。 希望这会有所帮助..

  class Program { private static CancellationTokenSource _cancellationTokenSource; private static ManualResetEvent _shutdownEvent = new ManualResetEvent(false); private static Thread _serviceStartThread; private static Thread _serviceStopThread; private static int workcounter = 0; static void Main(string[] args) { _cancellationTokenSource = new CancellationTokenSource(); _serviceStartThread = new Thread(DoWork); _serviceStopThread = new Thread(ScheduledStop); StartService(); StopService(); } private static void StartService() { _serviceStartThread.Start(); } private static void StopService() { _serviceStopThread.Start(); } /// <summary> /// Triggers a cancellation event for stopping the service in a timely fashion. /// </summary> private static void ScheduledStop() { while (!_shutdownEvent.WaitOne(0)) { if (workcounter == 10) { _cancellationTokenSource.Cancel(); } } } /// <summary> /// Represents a long running Task with cancellation option /// </summary> private static void DoWork() { while (!_shutdownEvent.WaitOne(0)) { if(!_cancellationTokenSource.Token.IsCancellationRequested) { workcounter += 1; Console.Write(Environment.NewLine); Console.Write("Running...counter: " + workcounter.ToString()); Thread.Sleep(1000);//Not needed, just for demo.. } else { Console.Write(Environment.NewLine); Console.Write("Recieved cancellation token,shutting down in 5 seconds.. counter: " + workcounter.ToString()); _shutdownEvent.Set(); Thread.Sleep(5000);//Not needed, just for demo.. } } } } 

为什么不在Windows服务types的解决scheme中创build一个新项目? 这设置了您需要实现的所有结构,甚至包括服务启动/停止事件的处理程序。